Flask项目笔记_1

7 篇文章 0 订阅
2 篇文章 0 订阅

项目简介

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

  • 前后端不分离:就如之前的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("/<re(r'.*'):html_file_name>")  # 自定义转换器
      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:从服务器删除资源
  • 状态码

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

后端接口事项

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

接口文档

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

  • 如:

    接口:获取图片验证码

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

    URL:/api/v1.0/image_code/<iamge_code_id>

    请求方式:GET

    传入参数:

    ​ 格式:JSON

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

    返回值:

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

    名字类型是否必须说明
    errnostr错误代码
    errmsgstr错误内容

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值