找回密码
 立即注册
首页 业界区 安全 web框架——flask-1

web框架——flask-1

荆邦 2025-11-19 13:20:01
   大纲:
  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框架理解

  •   flask的组成
核心组成     :路由 / 视图 / 模板(jinja2)/ 请求与响应 / 会话管理(主要是session)/ 错误处理 / 上下文机制
扩展(中间件):Flask-SQLAlchemy(ORM工具 简化数据库操作)等

  •   flask werkzeug wsgi 三者关系
flask是基于werkzeug构建的上层框架,而werkzeug是遵循wsig协议的工具库

  •   基于flask快速搭建网站格式
  1. """基于flask快速搭建网站"""
  2. from flask import Flask
  3. app = Flask(__name__)
  4. @app.route('/login',methods=['GET','POST'])
  5. def login():
  6.     return 'xxx'
  7. if __name__ == '__main__':
  8.     app.run()
复制代码
 
站点配置项(设置配置项)
将站点配置写在config文件下,主文件引入:app.config.from_object('settings . 想要引入的类')
config . py文件:
  1. class BaseConfig(object):
  2.     """站点的基础配置"""
  3.     #快速找bug配置
  4.     DEBUG=False
  5.     #给站点数据进行加密钥
  6.     SECRET_KEY='adsfgfadsgadfgsad'
  7. class ProductionConfig(BaseConfig):
  8.     """生产环境下的站点配置"""
  9.     pass
  10. class DevelopmentConfig(BaseConfig):
  11.     """开发环境下的站点配置"""
  12.     DEBUG=True
  13. class TestConfig(BaseConfig):
  14.     """测试环境下的站点配置"""
  15.     pass
复制代码
run.py文件:
  1. from flask import Flask
  2. app = Flask(__name__)
  3. # 引入settings文件下的开发环境站点配置类
  4. app.config.from_object('settings.DevelopmentConfig')      
  5. @app.route('/login',methods=['GET','POST'])
  6. def login():
  7.     return 'xxx'
  8. if __name__ == '__main__':
  9.     app.run()
复制代码
 
路由

  •   url
  1. @app.route('/login')
  2. def login():
  3.     pass
  4.   
  5. #视图函数名通常和url名一致
复制代码

  •   url参数的限制 / methods
  1. @app.route('/login/<int:num>',methods=['GET','POST'])
  2. def login(num):
  3.     return f'{num}'
复制代码

  •   endpoint   
  1. @app.route('/login/<int:user_id>',methods=['GET','POST'],endpoint='nb')
  2. def login(user_id):
  3.     #反向生成url
  4.     print(url_for('nb',user_id = user_id))
  5.     return f'{user_id}'
  6. #endpoint给视图函数器别名
复制代码

  •   redirect_to
  1. @app.route('/login/',methods=['GET','POST'],endpoint='nb')
  2. def login():
  3.     return 'hhh'
  4. @app.route('/xx',redirect_to='/login')
  5. def xx():
  6.     pass
  7.    
  8. #redirect_to写在路由
  9. #redirect写在视图函数
复制代码
 
视图

  •   加装饰器
  1. def wrapper(func):
  2.     #将被装饰函数的元信息复制到装饰器内部定义的新函数中,避免元信息丢失
  3.     @functools.wraps(func)
  4.     def inner(*args,**kwargs):
  5.         print('before')
  6.         return func(*args,**kwargs)
  7.     return inner
  8. @app.route('/login/',methods=['GET','POST'])
  9. #若没有functools.wraps(func)则login__name__=inner   此装饰器装饰多个视图函数时视图函数的函数名均为inner,则利用视图函数反向生成url时视图函数名均为由inner
  10. #若加了则即使装饰多个视图函数,元信息被保留即inner__name__=原函数名,则反向生成url时是url_for(原函数名)
  11. @wrapper
  12. def login():
  13.     return '1'
复制代码

  •   利用url_for实现重定向
  1. def wrapper(func):
  2.     @functools.wraps(func)
  3.     def inner(*args,**kwargs):
  4.         print('before')
  5.         return func(*args,**kwargs)
  6.     return inner
  7. @app.route('/login/',methods=['GET','POST'])
  8. @wrapper
  9. def login():
  10.      return '1'
  11. @app.route('/xx')
  12. def xx():
  13.     return redirect(url_for('login'))
复制代码
 
http请求与响应

  •   flask生命周期
1.png

2.png


  •        请求(request相关属性方法)
3.png

4.png

属性/方法
  1. import json
  2. from flask import Flask,request
  3. app = Flask(__name__)
  4. app.config.from_object('settings.DevelopmentConfig')
  5. @app.route('/login',methods=['POST'])
  6. def login():
  7.     """
  8.     大纲:
  9.     接收http请求
  10.     单个:get
  11.     多个:getlist
  12.     """
  13.     """获取查询字符串"""
  14.     # #单个     http://127.0.0.1:5000/login?username=guohan&fav=tv
  15.     # username = request.args.get('username')
  16.     # fav = request.args.get('fav')
  17.     # print(username,fav)
  18.     # guohan ['tv']
  19.     #
  20.     # #多个     http://127.0.0.1:5000/login?username=guohan&fav=tv&fav=tt&fav=bb
  21.     # username = request.args.get('username')
  22.     # fav = request.args.getlist('fav')
  23.     # print(username,fav)
  24.     # guohan ['tv', 'tt', 'bb']
  25.     """获取表单数据 不含文件"""
  26.     # #单个
  27.     # username = request.form.get('username')
  28.     # fav = request.form.get('fav')
  29.     # print(username,fav)
  30.     #
  31.     # #多个
  32.     # username = request.form.get('username')
  33.     # fav = request.form.getlist('fav')
  34.     # print(username,fav)
  35.     """获取表单数据 含文件并保存"""
  36.     # pc = request.files.get('pc')
  37.     # pc.save(r'./1.png')
  38.     """获取请求体中json格式的数据"""
  39.     # #直接获取请求体中json格式数据并转换成py中对应数据类型      类似fetchAPI中Response对象.json()
  40.     # print(request.json)
  41.     #
  42.     # #先获取原始json格式数据然后再手动转换成py中对应数据类型
  43.     # data = request.data
  44.     # print(json.loads(data))
  45.     """获取请求头相关信息"""
  46.     print(request.headers.get('Content-Type'))
  47.     return 'hello'
  48. if __name__ == '__main__':
  49.     app.run()
复制代码

  •        响应(response相关属性方法)
3种返回响应写法
  1. #返回响应3种写法本质都是Response对象
  2. #1 以元组形式返回
  3.         #格式 return 合法响应内容,状态码,响应头
  4.     #示例1
  5.     return render_template('./login.html'),200
  6.     #示例2:响应json格式数据
  7.     data = {'name':'guohan','age':22}
  8.         #写法1
  9.     return json.dumps(data),200,{'Content-Type':'application/json'}
  10.         #写法2 引入jsonify(flask下)
  11.     return jsonify(data)
  12.     #示例3:响应其他格式数据
  13.     with open('1.png','rb') as f:
  14.         res = f.read()
  15.     return res,200,{'Content-Type':'image/png'}
  16. #2 通过make_response()返回Response对象
  17. response = make_response(render_template('./login.html'),200)
  18. return response
  19. #3 直接返回Response对象
  20. return Response(render_template('./login.html'),200)
复制代码
response相关属性方法
  1. #2 以make_responser()/Response()返回时,Response对象的属性及方法
  2. data = {'name':'guohan','age':22}
  3. response = make_response(json.dumps(data))
  4. #属性/方法
  5. #状态码
  6. response.status_code = 200
  7. #响应头
  8. response.headers['Content-Type'] = 'application/json'
  9. #设置Cookie
  10. #格式     Response对象.set_cookie('key','value')
  11. response.set_cookie('user_id','2')
  12. #删除cookie
  13. #格式     Response对象.delete_cookie('key')
  14. response.delete_cookie('user_id')
复制代码
5.png

http会话控制
6.png


  •   Cookie(在客户端存储信息,不同域名Cookie不同)
7.png
  1. response = make_response(render_template('./login.html'))
  2. #设置Cookie
  3. #格式     Response对象.set_cookie('key','value',max_age=xxx s)
  4. # max_age指Cookie的有效时间,以s为单位,若不设置Cookie则是在关闭浏览器后失效
  5. response.set_cookie('user_id','2',max_age=3600)
  6. #删除cookie
  7. #格式     Response对象.delete_cookie('key')
  8. response.delete_cookie('user_id')
  9. return response
复制代码

  •        Session(在服务端存储信息/加密后存于Cookie)
flask中session数据加密后会放在cookie中,后面随请求发送到服务器
Session用法(增删改查)类比字典
8.png

9.png
  1. class BaseConfig(object):
  2.     """站点的基础配置"""
  3.     DEBUG=False
  4.     SECRET_KEY='adsfgfadsgadfgsad'
复制代码
 
 
此随笔代码笔记
D:\guohan\code\web\day1-2\config.py

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册