Flask开发相关 2021-07-18

能正青
2023-12-01

https://dormousehole.readthedocs.io/en/latest/index.html 已经写得挺清楚了,应该先去看一遍。但除此之外还有很多内容没有涉及到,并且Flask中许多功能必须借助别的包实现,因此在此做一总结。

MySQL数据库

用了flask_sqlalchemy,参考 https://www.jianshu.com/p/73071abb607e

SessionID

在Flask中,没有session_id的获取方式( https://stackoverflow.com/questions/15156132/flask-login-how-to-get-session-id ),虽然可以从cookie里面获取session,但并不是一个好的方法。如果需要session id,可以考虑自己在数据库中进行存储以便自己管理session。

注:

  • 可以通过flask-loginsession_protection,获得flask.session['_id'],但该种方式仍然是需要有session才能获取,所以不适用于单独一个API请求中带有sessionID的情况。
  • flask-login中提供了适用于API的SecureCookieSessionInterface貌似可解决sessionID的问题,但我没有尝试,具体说明在: https://flask-login.readthedocs.io/en/latest/#disabling-session-cookie-for-apis
  • 关于session的具体用法,参见 https://www.askpython.com/python-modules/flask/flask-sessions
  • 关于cookie操作,参见 https://pythonbasics.org/flask-cookies/ 或 https://blog.csdn.net/guoqianqian5812/article/details/75305697

用户管理

使用 flask-login : https://flask-login.readthedocs.io/en/latest/ ,具体例子可以看 https://github.com/toddbirchard/flasklogin-tutorial

表单管理

表单的具体例子也可以看 https://github.com/toddbirchard/flasklogin-tutorial

用的是flask-WTF,具体说明可以看 https://www.yiibai.com/flask/flask_wtf.html

项目布局

在 https://dormousehole.readthedocs.io/en/latest/tutorial/layout.html 中,只介绍了把一个blueprint的内容都放在一个python文件里面的方法。

如果要在同一个blueprint里面放多个文件的view,可以在app.py中做一次import(比如import user.routes, blog.routes,虽然后面的代码中没有用到import进来的东西,但有import的话就会扫描这部分代码,将这个代码文件中的接口进行注册)。

目前的架构是:

`app.py`: 里面包括:
==================
from flask import Flask
from db import db
import user.routes, blog.routes
from api import bp

class Config:
    SQLALCHEMY_DATABASE_URI = "xxx"
    SQLALCHEMY_TRACE_MODIFICATIONS = True

if __name__ == '__main__':
    app = Flask(__name__)
    app.config.from_object(Config)
    app.secret_key = os.urandom(24)
    db.init_app(app)
    with app.app_context():
        app.register_blueprint(bp)
        db.create_all()
    app.run(host='localhost', port=5000, debug=True)
==================

`api.py`中包括:
==================
from flask import Blueprint
# 使用BluePrint管理/api子路由
bp = Blueprint('api', __name__, url_prefix='/api')
==================


`db.py`中包括:
==================
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
==================

`user/routes.py`中包括:
==================
from api import bp
from db import db

@bp.route('/login', methods=['POST'])
def login():
==================

遇到的错误

  1. 找不到某个route
    • route文件需要import一下才可以加载出来。
  2. 关于FormDataRoutingRedirect: A request was sent to this URL (http://example.com/myurl) but a redirect was issued automatically by the routing system to “http://example.com/myurl/”.
    • 如果不写methods的话,默认没有post。https://stackoverflow.com/questions/20293372/formdataroutingredirect-exception-from-a-url-without-trainling-slash
  3. POST请求里面form中没有数据
    • 检查一下前端是不是没用form格式传数据而是用raw格式,比如json数据需要用request.json()函数获得
 类似资料: