Flask+mongo探讨

最近遇到了很多问题,快速总结下问题以及已经解决的部分,大家可以一块交流探讨

技术框架

  • Flask
  • pymongo
  • mongoengine
  • flask-restful
  • Logging

项目模块拆分


原则上是拆的越细越好,各模块之间功能分离,易于维护,可指派task给团队成员,各人维护不同模块

  • 主入口manage.py
  • 初始化__init__.py, 各个应用在此注册,如蓝图,logging,db等
  • 路由routes.py,蓝图在此实例化,api所有接口放在这里方便查看管理
  • utli 自己封装的外部方法,哪个应用需要就调用
  • api 下面不同的数据库就建不同应用,应用包含models.pyapi.py

已解决问题


1.循环调用问题,模块拆分可使项目更加清晰,但模块间难免有调用的情况,但如果a调用b,b又调用a,就会造成循环调用,报错. 建议重头梳理项目关系,避免循环调用

2.mongoengine, mongo最大的特点就是其自由度,易扩展,建表时不需要id字段,mongo会自己添加一个_id字段,取的时候就是obj.id或者obj['id'],如果表中既有id字段又有_id字段,那就取不到id字段了,解决方法是:model中collections下,

class Lessons(Document):
    """课时"""
    uid = StringField(db_field='id')
    num = StringField()
    level = StringField()

采取映射,使用db_field将uid字段映射到数据库表中的id字段,取值时

lesson = Lesson.objects.first()
lesson.uid

3.restful跨域问题,跨域问题在前后端交互算是很经典的问题了,理论上就是Access-Control-Allow-Origin设置为*,请求头allow参数开放,可以在__init__.py文件中设置全局请求头

# 全局响应头
    @app.after_request
    def after_request(response):
        response.headers.add('Access-Control-Allow-Origin', '*')
        if request.method == 'OPTIONS':
            response.headers['Access-Control-Allow-Methods'] = 'DELETE, GET, POST, PUT'
            headers = request.headers.get('Access-Control-Request-Headers')
            if headers:
                response.headers['Access-Control-Allow-Headers'] = headers
        return response

然后

pip install Flask-Cors
# 在__init__.py中的createapp方法中注册
CORS(app, supports_credentials=True)

4.模块拆分之后,实例化app只有一次,如何注册蓝图和flask-restful

Routes.py

# routes.py
from api import *
from flask import Blueprint
from flask_restful import Api

BlogApi = Blueprint('api', __name__, url_prefix='/v1')

docs = Api(BlogApi)
docs.add_resource(CreateLesson, '/admin/lession/', endpoint='lession')

__init__.py

from routes import docs
blueprints = ['routes:BlogApi']

def createapp():
    docs.init_app(app)
    # 注册所有蓝图
    for bp_name in blueprints:
        bp = import_string(bp_name)
        app.register_blueprint(bp)

可以看出当不拆分模块的时候,应用注册都是 app. 现在使用应用.init_app去初始化app

5.顺便提一下logging的使用,不拆分模块时,log的使用

try:
    ...
except Exception as e:
    app.logger.error(e)

但现在app实例化一次,在其他模块没法调用app,这时候可以使用current_app

from flask import current_app

try:
    ...
except Exception as e:
    current_app.logger.error(e)

未解决问题


由于mongo本身使用就少,mongoengine使用文档百度不超过一页,所有很多问题需要谷歌,查看英文文档,现在仍有些问题未解决

1.使用mongoengine如何迁移数据库, 因为mongoengine这个第三方库一直在维护,使用群体多,而且比起其他mongo orm成熟些,所以使用的mongoengine

2.pyjwt在与其他后台语言对接时如何使用,为了防止api被爬取,使用jwt进行验证, go语言写的user,为在用python时怎么去添加jwt校验

你可能感兴趣的:(#,python后端-Flask)