大纲:
1.flask框架理解
flask的组成
flask werkzeug wsgi 三者关系
基于flask快速搭建网站格式
2.站点配置项
3.路由
url
url参数的限制
methods
endpoint
redirect_to
4.视图
加装饰器
利用url_for实现重定向
5.http请求与响应
flask生命周期
请求(request相关属性方法)
响应
3种返回响应写法
Response对象相关属性方法
6.http会话控制
Cookie
Session
flask框架理解
核心组成 :路由 / 视图 / 模板(jinja2)/ 请求与响应 / 会话管理(主要是session)/ 错误处理 / 上下文机制
扩展(中间件):Flask-SQLAlchemy(ORM工具 简化数据库操作)等
flask是基于werkzeug构建的上层框架,而werkzeug是遵循wsig协议的工具库
- """基于flask快速搭建网站"""
- from flask import Flask
- app = Flask(__name__)
- @app.route('/login',methods=['GET','POST'])
- def login():
- return 'xxx'
- if __name__ == '__main__':
- app.run()
复制代码
站点配置项(设置配置项)
将站点配置写在config文件下,主文件引入:app.config.from_object('settings . 想要引入的类')
config . py文件:- class BaseConfig(object):
- """站点的基础配置"""
- #快速找bug配置
- DEBUG=False
- #给站点数据进行加密钥
- SECRET_KEY='adsfgfadsgadfgsad'
- class ProductionConfig(BaseConfig):
- """生产环境下的站点配置"""
- pass
- class DevelopmentConfig(BaseConfig):
- """开发环境下的站点配置"""
- DEBUG=True
- class TestConfig(BaseConfig):
- """测试环境下的站点配置"""
- pass
复制代码 run.py文件:- from flask import Flask
- app = Flask(__name__)
- # 引入settings文件下的开发环境站点配置类
- app.config.from_object('settings.DevelopmentConfig')
- @app.route('/login',methods=['GET','POST'])
- def login():
- return 'xxx'
- if __name__ == '__main__':
- app.run()
复制代码
路由
- @app.route('/login')
- def login():
- pass
-
- #视图函数名通常和url名一致
复制代码- @app.route('/login/<int:num>',methods=['GET','POST'])
- def login(num):
- return f'{num}'
复制代码- @app.route('/login/<int:user_id>',methods=['GET','POST'],endpoint='nb')
- def login(user_id):
- #反向生成url
- print(url_for('nb',user_id = user_id))
- return f'{user_id}'
- #endpoint给视图函数器别名
复制代码- @app.route('/login/',methods=['GET','POST'],endpoint='nb')
- def login():
- return 'hhh'
- @app.route('/xx',redirect_to='/login')
- def xx():
- pass
-
- #redirect_to写在路由
- #redirect写在视图函数
复制代码
视图
- def wrapper(func):
- #将被装饰函数的元信息复制到装饰器内部定义的新函数中,避免元信息丢失
- @functools.wraps(func)
- def inner(*args,**kwargs):
- print('before')
- return func(*args,**kwargs)
- return inner
- @app.route('/login/',methods=['GET','POST'])
- #若没有functools.wraps(func)则login__name__=inner 此装饰器装饰多个视图函数时视图函数的函数名均为inner,则利用视图函数反向生成url时视图函数名均为由inner
- #若加了则即使装饰多个视图函数,元信息被保留即inner__name__=原函数名,则反向生成url时是url_for(原函数名)
- @wrapper
- def login():
- return '1'
复制代码- def wrapper(func):
- @functools.wraps(func)
- def inner(*args,**kwargs):
- print('before')
- return func(*args,**kwargs)
- return inner
- @app.route('/login/',methods=['GET','POST'])
- @wrapper
- def login():
- return '1'
- @app.route('/xx')
- def xx():
- return redirect(url_for('login'))
复制代码
http请求与响应
属性/方法- import json
- from flask import Flask,request
- app = Flask(__name__)
- app.config.from_object('settings.DevelopmentConfig')
- @app.route('/login',methods=['POST'])
- def login():
- """
- 大纲:
- 接收http请求
- 单个:get
- 多个:getlist
- """
- """获取查询字符串"""
- # #单个 http://127.0.0.1:5000/login?username=guohan&fav=tv
- # username = request.args.get('username')
- # fav = request.args.get('fav')
- # print(username,fav)
- # guohan ['tv']
- #
- # #多个 http://127.0.0.1:5000/login?username=guohan&fav=tv&fav=tt&fav=bb
- # username = request.args.get('username')
- # fav = request.args.getlist('fav')
- # print(username,fav)
- # guohan ['tv', 'tt', 'bb']
- """获取表单数据 不含文件"""
- # #单个
- # username = request.form.get('username')
- # fav = request.form.get('fav')
- # print(username,fav)
- #
- # #多个
- # username = request.form.get('username')
- # fav = request.form.getlist('fav')
- # print(username,fav)
- """获取表单数据 含文件并保存"""
- # pc = request.files.get('pc')
- # pc.save(r'./1.png')
- """获取请求体中json格式的数据"""
- # #直接获取请求体中json格式数据并转换成py中对应数据类型 类似fetchAPI中Response对象.json()
- # print(request.json)
- #
- # #先获取原始json格式数据然后再手动转换成py中对应数据类型
- # data = request.data
- # print(json.loads(data))
- """获取请求头相关信息"""
- print(request.headers.get('Content-Type'))
- return 'hello'
- if __name__ == '__main__':
- app.run()
复制代码 3种返回响应写法- #返回响应3种写法本质都是Response对象
- #1 以元组形式返回
- #格式 return 合法响应内容,状态码,响应头
- #示例1
- return render_template('./login.html'),200
- #示例2:响应json格式数据
- data = {'name':'guohan','age':22}
- #写法1
- return json.dumps(data),200,{'Content-Type':'application/json'}
- #写法2 引入jsonify(flask下)
- return jsonify(data)
- #示例3:响应其他格式数据
- with open('1.png','rb') as f:
- res = f.read()
- return res,200,{'Content-Type':'image/png'}
- #2 通过make_response()返回Response对象
- response = make_response(render_template('./login.html'),200)
- return response
- #3 直接返回Response对象
- return Response(render_template('./login.html'),200)
复制代码 response相关属性方法- #2 以make_responser()/Response()返回时,Response对象的属性及方法
- data = {'name':'guohan','age':22}
- response = make_response(json.dumps(data))
- #属性/方法
- #状态码
- response.status_code = 200
- #响应头
- response.headers['Content-Type'] = 'application/json'
- #设置Cookie
- #格式 Response对象.set_cookie('key','value')
- response.set_cookie('user_id','2')
- #删除cookie
- #格式 Response对象.delete_cookie('key')
- response.delete_cookie('user_id')
复制代码
http会话控制
- Cookie(在客户端存储信息,不同域名Cookie不同)
- response = make_response(render_template('./login.html'))
- #设置Cookie
- #格式 Response对象.set_cookie('key','value',max_age=xxx s)
- # max_age指Cookie的有效时间,以s为单位,若不设置Cookie则是在关闭浏览器后失效
- response.set_cookie('user_id','2',max_age=3600)
- #删除cookie
- #格式 Response对象.delete_cookie('key')
- response.delete_cookie('user_id')
- return response
复制代码
- Session(在服务端存储信息/加密后存于Cookie)
flask中session数据加密后会放在cookie中,后面随请求发送到服务器
Session用法(增删改查)类比字典
- class BaseConfig(object):
- """站点的基础配置"""
- DEBUG=False
- SECRET_KEY='adsfgfadsgadfgsad'
复制代码
此随笔代码笔记
D:\guohan\code\web\day1-2\config.py
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |