Flask项目笔记_1

文章目录

      • 项目简介
      • session和redis使用
      • CSRF防护
      • 项目目录的创建事项
      • Restful风格
      • 后端接口事项
      • 接口文档

项目简介

  • 该项目是一个前后端分离的手机端租房项目

  • 前后端不分离:就如之前的Django项目,服务器是把一个渲染好的页面返回给浏览器

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G5QBHSNg-1571491471128)(https://FXHao.github.io/images/posts/flask项目/图1.jpg)]

  • 前后端分离:后端不再控制前端的显示效果,如把静态资源放在nginx服务器上,页面由nginx提供,然后服务器只提供数据

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-whpeAcZ7-1571491471129)(https://FXHao.github.io/images/posts/flask项目/图2.png)]

    • 缺点:搜索引擎优化SEO不太好,因为搜索引擎搜索时,它的页面本没有有用的数据,因为它是被访问时才访问数据

session和redis使用

  • 因为Flask的session机制是把session放入前端的cookie中的,这时需要用Flask-Session扩展,由我们自定义将session存放在哪里

    • 使用时直接是Session(app),然后还需配置一下

      # flask-session配置
          SESSION_TYPE = "redis"
          SESSION_REDIS = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT)
          SESSION_USE_SIGNER = True  # 对cookies中的session_id进行隐藏
          PERMANENT_SESSION_LIFETIME = 24 * 3600  # session数据的有效期,单位秒
      
  • redis的使用

    import redis
    redis_store = redis.StrictRedis(host=config_clss.REDIS_HOST, port=config_clss.REDIS_PORT)
    

CSRF防护

  • 只要前端发送POST数据给后端,就一定得注意CSRF攻击,而Flask官方没有CSRF防护机制的,但flask-WTF扩展表单提交中的CSRF防护是独立出来的,我们可以单独使用其功能

    from flask_wtf import CSRFProtect
    CSRFProtect(app)
    
    • 其原理其实为钩子,即在所有求情前先过滤
  • 防护机制

    • 服务器会向浏览器的cookie中写入一条csrf_token数据,然后在表单中准备一条csrf_token,当用户提交表单时,服务器会拿两条csrf_token进行比较
    • 浏览器有同源策略,它会限制不同源的网站不能相互操作资源,即写入cookie中的网站才有权限去操作该cookie的内容
  • csrf_token的设置

    • 在前后端分离的情况下,我们可以在用户一开始访问的时候就把csrf_token写入cookie中(即在请求静态资源时写入)

      # 创建一个csrf_token值
      csrf_token = csrf.generate_csrf()
      
    • CSRF机制中,后端读取前端的csrf_token时,是执行request.form.get("csrf_token"),读取的是表单数据,但是我们约定和前端传输数据的格式为JSON格式,这时请求的数据不是表单格式,其机制就无法取出csrf_token值,这时,可以将csrf_tokende放入请求头中:X-CSRFToken

项目目录的创建事项

  • 我们创建的目录样式就像之前Django的项目一样,用一个manage.py当启动文件,其它的东西都放在相应的文件或文件夹中

  • 工程目录预览

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4kpAWS6v-1571491471130)(https://FXHao.github.io/images/posts/flask项目/图3.png)]

  • 配置信息类可以单独创建一个config.py放置(在最顶级的项目目录中),因为在开发中和线上用的配置信息是不同的,我们可以把不同的配置信息放入一个类中,然后分别创建两个子类继承与父类,分别配置开发环境和线上环境

    class Config(object):
        """配置信息"""
    	pass
    	
    class DevelopmentConfig(Config):
        """开发模式的配置信息"""
        pass
        
    class ProductionConfig(Config):
        """生产环境的配置信息"""
        pass
    
    # 建立名字和类的映射关系
    config_map = {
        "develop": DevelopmentConfig,
        "product": ProductionConfig
    }
    
  • app工厂模式(放入ihome的__init__.py中)

    # 工厂模式
    def create_app(config_name):
    	"""创建flask应用对象"""
        app = Flask(__name__)
        ...
        return app
    

    创建flask对象时:app = create_app("develop/product")

  • 数据库

    from flask_sqlalchemy import SQLAlchemy
    db = SQLAlchemy(app)
    
    • 初始化方式:先创建对象,这个对象先不与Flask绑定到一起,什么时候有了Flask对象,再与其绑定到一起

      db = SQLAlchemy()
      # 使用app初始化
      db.init_app(app) # 这个可以放到app创建之后
      
  • 蓝图创建的思路

    • 可以像Django一样,按功能模块(用户模块、购物车模块…)来创建
    • 也可以把模块都放入一个蓝图中,然后蓝图按版本号来划分,因为随业务增加,功能也会增加,这样就有利于版本的保留
  • 日志功能

    • Flask中并没有提供日志的功能,但在Python中有个标准模块logging,它可以为Flask提供日志功能,其配置信息可以在网上查询即可

      # 配置日志信息
      # 创建日志记录器,指明日志保存的路径、每个日志文件的最大大小、保存的日志文件个数上限
      file_log_handler = RotatingFileHandler("logs/log", maxBytes=1024 * 1024 * 100, backupCount=10)
      # 创建日志记录的格式                 日志等级    输入日志信息的文件名 行数    日志信息
      formatter = logging.Formatter('%(levelname)s %(filename)s:%(lineno)d %(message)s')
      # 为刚创建的日志记录器设置日志记录格式
      file_log_handler.setFormatter(formatter)
      # 为全局的日志工具对象(flask app使用的)添加日记录器
      logging.getLogger().addHandler(file_log_handler)
      # 设置日志的记录等级
      logging.basicConfig(level=logging.DEBUG)  # 调试debug级
      
      
    • Flask中有个current_app,其中存储了logging的全局对象

      # 这两句等价
      logging.error()
      current_app.logger.error()
      
      
      • 要注意的是,在config.py中的日志等级会覆盖掉__init__.py中(即上面)的日志等级
  • 循环导入问题:查看其导入逻辑,推迟一方的导入即可

  • 静态文件的提供

    • 可以在ihome中另外写一个蓝图专门提供静态页面(web_html.py

      from flask import Blueprint, current_app, make_response
      from flask_wtf import csrf
      # 提供静态文件的蓝图
      html = Blueprint("web_html", __name__)
      
      # 127.0.0.1:5000/
      # 127.0.0.1:5000/index.html
      # 127.0.0.1:5000/register.html
      @html.route("/")  # 自定义转换器
      def get_html(html_file_name):
          """提供HTML静态文件"""
          if not html_file_name :
              html_file_name = "index.html"
      
          # 如果资源名不是favicon.ico
          if html_file_name != "favicon.ico":
              html_file_name = "html/" + html_file_name
      
          # 创建一个csrf_token值
          csrf_token = csrf.generate_csrf()
      
          # flask 提供的返回静态文件的方法
          resp = make_response(current_app.send_static_file(html_file_name))
      
          # 设置cookie值
          resp.set_cookie("csrf_token",csrf_token)
          return resp
      
      

Restful风格

  • REST是设计风格而不是标准,是指客户端和服务器的交互形式,我们需要关注的重点是如何设计REST风格的网络接口

  • api部署在专用域名下,或将api放在主域名下

    http://api.example.com
    http://www.example.com/api/
    
    
  • API的版本号放在url

    http://www.example.com/app/1.0/info
    http://www.example.com/app/1.2/info
    
    
  • 路径表示API的具体网址,每个网址代表一种资源,资源作为网址,网址中不能有动词只能有名词,一般名词要与数据库的表名对应,而且名词要使用复数

    http://www.example.com/getGoods  # 错误的
    http://www.example.com/app/goods/1  # 单个商品
    http://www.example.com/app/goods   # 所有商品
    
    
  • 对于资源的具体操作类型,由HTTP动词表示,常用的HTTP动词有四个

    • GET======>select:从服务器获取资源
    • POST=====>create:在服务器新建资源
    • PUT======>update:在服务器更新资源
    • DELETE===>delete:从服务器删除资源
  • 状态码

    状态码 信息 含义
    200 OK 服务器成功返回用户请求的数据
    201 CREATED 用户新建或修改数据成功
    202 Accepted 表示请求已进入后台排队
    400 INVALID REQUEST 用户发出的请求有错误
    401 Unauthorized 用户没有权限
    403 Forbidden 访问被禁止
    404 NOT FOUND 请求针对的是不存在的记录
    406 Not Acceptable 用户请求的的格式不正确
    500 INTERNAL SERVER ERROR 服务器发生错误

后端接口事项

  • 基本套路流程:获取参数、校验参数(是否合理、有效)、业务逻辑处理、返回
  • 常量数据可以另写一个文件存储,不要写在哥哥文件中,如可以在ihome下新建一个constants.py文件,里面存放需要用到的常量数据

接口文档

  • 需包含:接口名字、描述(描述清楚接口功能)、URL、请求方式、传入参数、返回值

  • 如:

    接口:获取图片验证码

    描述:前端访问,可以获取图片验证码

    URL:/api/v1.0/image_code/

    请求方式:GET

    传入参数:

    ​ 格式:JSON

    名字 类型 是否必须 说明
    image_code_id str 验证码图片的编码

    返回值:

    ​ 格式:正常:图片 异常:JSON

    名字 类型 是否必须 说明
    errno str 错误代码
    errmsg str 错误内容

    ​ 实例:'{"errno":"4001", "errmsg":"save iamge error"}'

今天先写到这把。。。睡觉去咯。。。。未完待续》》》》

你可能感兴趣的:(Flask,Flask项目,python)