摘要:每天的内容跑起来模板引擎表单文件上传邮件发送一框架的简介模型负责数据的操作视图负责数据的展示控制器控制你的的操作以及视图模板的渲染在中叫做模型负责数据的操作控制你的的操作以及视图模板的渲染业务逻辑的操作模板负责数据的展示二架构三概念是
flask
每天的内容
flask跑起来
模板引擎
flask表单
文件上传邮件发送
flask-sqlalchemy
一、web框架的简介M 模型 负责数据的操作
V 视图 负责数据的展示
C 控制器 控制你的M的操作以及视图模板的渲染
在python中叫做MVT
M 模型 负责数据的操作
V 控制你的M的操作以及视图模板的渲染 业务逻辑的操作
T templates 模板 负责数据的展示
二、架构BS browser-》server
CS client-》server
三、FLASK概念: flask是一个非常小的web框架 被称为微型框架 只提供了一个强健的核心 其它的都是通过第三方扩展库来实现
组成:
调试 路由 WSGI
模板引擎 jinja2 (就是由flask核心人员开发的模板引擎)
使用:
安装 pip install flask
from flask import Flask
app = Flask(__name__) #实例化flask
#路由地址 根据用户不同的url进行处理
@app.route("/")
def index():#处理当前请求的函数
return "Hello Flask"
if __name__ == "__main__":
app.run() #运行当前的flask
四、视图函数
(1) 无参路由
#路由地址和视图函数名称 是否同名没有关系
#http://127.0.0.1:5000/test/
@app.route("/test/") #路由地址末尾的/建议加上
def test():
return "我是测试使用的视图函数"
(2) 带一个参数的路由
http://127.0.0.1:5000/page/10/
@app.route("/page//") #参数的语法格式 /路由名称/<形参名>/
def page(pagenum):
return "当前的页码为{}".format(pagenum)
(3) 带多个参数
#带多个参数
# http://127.0.0.1:5000/arg/10/zhansgan/
@app.route("/arg///")
def getarg(age,name):
return "我叫{} 我见年{}岁了".format(name,age)
# http://127.0.0.1:5000/arg/zhansgan_10/
@app.route("/arg/_/")
def getarg(age,name):
return "我叫{} 我见年{}岁了".format(name,age)
(4) 限制参数的类型
#参数类型
# @app.route("/argtype//")
# @app.route("/argtype//") #限定参数类型为int
# @app.route("/argtype//") #限定参数类型为float
# @app.route("/argtype//") #限定参数类型为string 默认就是字符串
@app.route("/argtype//") #其实path就是string 但是path会将路由地址后面的所有的路由或者值都认为是一个值 /不在作为分隔符来使用
def argtype(arg):
print(type(arg))
print(arg)
return "获取参数类型的视图函数"
注意
路由地址末尾的/建议加上 因为如果输入的时候没有加默认的/浏览器会自动帮你加上
形参名字写在路由的<> 中间
参数默认类型都为string
五、视图函数的响应 (1) return 字符串进行响应@app.route("/response/")
def res():
return "我是响应",404 #响应一个指定标准的状态码
(2) 通过make_response构造响应
from flask import make_response
@app.route("/make_response/")
def makeResponse():
res = make_response("我是响应的内容")
# res = make_response("我是响应的内容",404)
return res
六、重定向 redirect
作用: 从一个地址跳向另外一个地址
导入
from flask import redirect
实例
@app.route("/")
def index():#处理当前请求的函数
return "Hello Flask"
#重定向
@app.route("/redirect/")
def redirect_index():
return redirect("/") #参数为路由地址
return redirect("/argtype/redirect_index/") #带参数路由地址的重定向
url_for 通过视图函数名称 反向构造出路由地址
导入
from flask import redirect,url_for
实例
@app.route("/redirect/")
def redirect_index():
url = url_for("test")
url = url_for("getarg",name="zhangsan",age=18) #带多个参数
#@app.route("/arg/_/")
#def getarg(age,name):
return url #/test/
注意:
如果给定的视图函数名称不存在 则抛出异常
url_for 和 redirect 组合使用@app.route("/redirect/")
def redirect_index():
return redirect(url_for("test"))
return redirect(url_for("getarg",name="zhangsan",age=18)) #带多个参数
七、abort 终止
概念:
在视图函数中处理的时候 可以使用abort抛出指定状态码的错误 下面代码不在执行
需要抛出标准http的状态码
from flask import abort
实例
@app.route("/abort/")
def my_abort():
# abort(404)
# abort(500)
return "抛出状态码"
#捕获500的错误
@app.errorhandler(500)
def server_error(e):
return "现在能看到了吗{}".format(e)
#捕获404的错误信息
@app.errorhandler(404)
def server_error(e):
return "您访问的页面被外星人劫持走了!!!"
八、app.run() 参数说明
| 参数 | 参数说明 | 默认值 |
|---|---|---|
| host | 主机名 | 127.0.0.1 |
| port | 端口号 | 5000 |
| debug | 调试 | False |
| threaded | 多线程 | False |
实例
if __name__ == "__main__":
# app.run(debug=True) #开启调试模式
app.run(host="0.0.0.0",port=5001,debug=True,threaded=True)
十、请求 request
说明:
request是由flask框架为我们提供好的对象 使用时 只要导入即可
用户在请求的时候 框架会为当前请求的用户 创建一个request(请求的对象) 包含当前用户请求的所有信息
导入
from flask import request
url 用户请求的完整的url
base_url 去除get传参后的url
host_url 只有主机和端口号的url
path 获取请求的路由地址
method 请求的方法
args 获取get传参
form 获取表单传递过来的数据
files 获取文件上传过来的数据
headers 获取用户请求过来的头信息
cookies 获取用户请求过来的所有cookie
json 获取用户请求过来的json数据
实例
@app.route("/request/")
def get_request():
print("用户请求的完整的url",request.url)
print("去除get传参后的url",request.base_url)
print("只有主机和端口号的url",request.host_url)
print("获取请求的路由地址",request.path)
print(" 请求的方法",request.method)
print("获取拼凑的get传参",request.args)
print("获取拼凑的get传参",request.args.get("name"))
print("获取拼凑的get传参",request.args.get("age"))
print("获取表单传递过来的数据",request.form)
print("获取文件上传过来的数据",request.files)
print("获取用户请求过来的头信息",request.headers)
print("获取用户请求过来的所有cookie",request.cookies)
print("获取用户请求过来的json数据",request.json)
return "request对象"
十一、会话控制 cookie和session
cookie
设置cookieresponse.set_cookie(
key, #设置键
value,#设置值
max_age=None, #过期时间
path = "/" #当前cookie的存储路径
)
获取cookie
@app.route("/get_cookie/")
def get_cookie():
print(request.cookies)
return request.cookies.get("name","default默认值")
删除cookie
#清除cookie
@app.route("/del_cookie/")
def del_cookie():
res = make_response("清除cookie")
res.delete_cookie("name")
return res
cookie存储值为明文存储 安全性低
cookie存在客户端(浏览器中)
cookie默认存活时间为 当前浏览结束(关闭当前的浏览器)
sessionsession的使用 需要一个secret_key 来进行加密产生加密的字符串
app.config["SECRET_KEY"] = "secretkey"
会给cookie设置一个唯一的标识符 sessionId 服务器端会通过cookie携带着唯一的sessionId来区分是哪一个用户的请求 如果客户端的cookie被禁用了 那么服务器端的session将无法使用 session基于cookie
设置session#设置session
@app.route("/set_session/")
def set_session():
默认存活当前浏览器结束
session["username"] = "张三"
return "设置session"
设置session 及过期时间
#设置session
@app.route("/set_session/")
def set_session():
session.permanent = True #设置session持久化存储
#设置当前session的存活时间60秒 如果当前设置失败 那么存活时间为1月
app.permanent_session_lifetime = timedelta(seconds=60)
session["username"] = "张三"
return "设置session"
获取session
#获取session
@app.route("/get_session/")
def get_session():
return session.get("username","default默认值")
删除session
@app.route("/del_session/")
def del_session():
#删除 key为username的session
session.pop("username")
#删除所有session
# session.clear()
return "删除session"
十二、flask-script扩展
简介:
就是一个flask终端运行的解析器 通过不同参数 来设置flask的启动项
安装
sudo pip3 install flask-script
使用
from flask_script import Manager #导入终端运行的解析器
app = Flask(__name__)
manager = Manager(app)
...
if __name__ == "__main__":
manager.run()
启动参数
| -h | 主机 |
|---|---|
| -p | 端口号 |
| -d | 调试 |
| -r | 重新加载 |
| -threaded | 多线程 |
python manage.py runserver -h十三、蓝本蓝图 Blueprintpython manage.py runserver -h0.0.0.0 -p5000 -d -r --threaded
python manage.py runserver -d -r
概述
当所有代码越爱越多的时候 在manage.py中 很明显是不合理的 我们需要将不同功能的视图函数 存放在不同的文件中 使用我们的项目的目录结构更加的清晰
使用
from flask import Blueprint
user = Blueprint("user",__name__)
@user.route("/login/")
def login():
return "登录"
from mysession import mysession from user import user #http://127.0.0.1:5000/login/ app.register_blueprint(user) #注册蓝本 #http://127.0.0.1:5000/user/login/ app.register_blueprint(user,url_prefix="/user") #注册蓝本并添加前缀蓝本中的重定向
@app.route("/")
def index():
# return "首页"
return redirect("/user/login/")
return redirect(url_for("user.login")) #使用url_for反向构造出路由的时候 需要指定当前的视图函数 是哪一个蓝本对象的
十四、请求钩子函数
在manage文件中使用
| 钩子函数 | 功能描述 |
|---|---|
| before_first_request | 第一次请求之前 |
| before_request | 每次请求之前 |
| after_request | 每次请求之后 没有异常 |
| teardown_request | 每次请求之后 即使有异常出现 |
实例
@app.before_first_request
def before_first_request():
print("before_first_request")
@app.before_request
def before_request():
print("before_request")
if request.method == "GET" and request.path == "/form/":
abort(500)
@app.after_request
def before_request(r):
print("before_request",r)
return r
@app.teardown_request
def teardown_request(r):
print("teardown_request")
return r
| 钩子函数 | 功能描述 |
|---|---|
| before_app_first_request | 第一次请求之前 |
| before_app_request | 每次请求之前 |
| after_app_request | 每次请求之后 没有异常 |
| teardown_app_request | 每次请求之后 即使有异常出现 |
实例
@user.before_app_first_request
def before_first_request():
print("before_first_request")
@user.before_app_request
def before_request():
print("before_request")
if request.method == "GET" and request.path == "/form/":
abort(500)
@user.after_app_request
def after_request(r):
print("after_request",r)
return r
@user.teardown_app_request
def teardown_request(r):
print("teardown_request")
return r
注意:
钩子函数写在蓝本或者启动文件中 都可以捕获到所有的请求和响应(一样)一个flask中只需要写一个钩子函数而不需要重复写钩子函数
flask入门2-模板引擎
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/41831.html
摘要:文件上传邮件发送一原生文件上传修改头像提交文件上传的视图函数有文件上传了拿到文件名称图片上传保存的路径使用和渲染文件上传自定义一个文件上传的表单类修改头像文件不能为空该文件类型不允许上传提交生成随机的图片名称获取图片大小设置尺寸当前缩放 文件上传邮件发送 一、原生文件上传 form.html 修改头像 manage.py...
摘要:一一个最小的应用是程序实例,一个项目只能有一个程序实例路由装饰器视图函数返回一个字符串把程序保存为用解释器运行访问,会看见问候。路由装饰器这个函数的返回值称为响应,是客户端接收到的内容。 一.一个最小的Flask应用 from flask import Flask app = Flask(__name__) #app是程序实例,一个项目只能有一个程序实例 @app.route(/) #...
阅读 26113·2021-09-29 09:41
阅读 5284·2021-09-10 11:20
阅读 2534·2021-09-09 09:32
阅读 2129·2019-08-30 15:44
阅读 3376·2019-08-29 17:13
阅读 3073·2019-08-29 14:14
阅读 2273·2019-08-29 14:11
阅读 3464·2019-08-29 12:36