Flask项目构建

作者: pdnbplus | 发布时间: 2024/06/17 | 阅读量: 168

Flask项目关键 -- 潘登同学的flask学习笔记

Flask项目的目录结构

|project_name
|--pro_name # 整个程序的包目录
|----__init__.py # 项目包文件
|----templates # 模板文件
|------common # 通用模板
|------errors # 错误页面
|------user # 用户模板
|------email # 邮件模板
|----static # 静态资源文件
|------js # JS脚本
|------css # 样式表
|------img # 图片
|------favicon.ico # 网站图表
|----user # 用户模块
|------__init__.py # 用户模块-包文件
|------views.py # 用户模块-视图文件
|----item # 产品模块
|------__init__.py # 产品模块-包文件
|------views.py # 产品模块-视图文件
|----models.py # 数据模型
|--app.py # 项目启动控制文件
|--config.py # 配置文件
|--requirements.txt # 依赖包列表
|--migrations # 数据库迁移目录

新建项目

  • 先写好一个app.py文件,然后操作一遍flask db ,也可以执行完下面的一系列操作后执行

注意:

  • 整个程序的包目录名不能为 app ,不然会报Error: Failed to find Flask application or factory in module 'app'. Use 'FLASK_APP=app:name' tospecify one.
  • 项目启动控制文件名为 app.py ,不然会报Error: Could not locate a Flask application. You did not provide the "FLASK_APP" environmentvariable, and a "wsgi.py" or "app.py" module was not found in the current directory.

如果确实需要用别的名字替换app.py,在同级目录下,创建env.文件,输入

FLASK_APP = xxx(别的名字)

如果仍然报错,重装python-dotenv这个库

pip uninstall python-dotenv
pip install python-dotenv

放对地方

将数据库、app等的配置放到config.py

# config.py
class BaseConfig:
    # 数据库的变量
    HOST = '127.0.0.1'  #127.0.0.1/localhost
    PORT = 3306
    DATA_BASE = 'flask_db'
    USER = 'root'
    PWD = 'xxx'
    DB_URI = f'mysql+pymysql://{USER}:{PWD}@{HOST}:{PORT}/{DATA_BASE}'
    SQLALCHEMY_DATABASE_URI = DB_URI
    SQLALCHEMY_TRACK_MODIFICATIONS = False

class DevelopmentConfig(BaseConfig):  # 开发的
    DEBUG = True

class ProductionConfig(BaseConfig):  # 产品的
    DEBUG = False

config = {
    'dev': DevelopmentConfig,
    'pro': ProductionConfig,
    'base': BaseConfig
}

将数据库模型放到models.py

# models.py
from pro_name import db
# 创建模型类
class User(db.Model):
    __tablename__ = 't_user'
    id = db.Column(db.Integer,primary_key =True,autoincrement = True)
    name = db.Column(db.String(32))
    pwd = db.Column(db.String(32))
    age = db.Column(db.Integer)
    city = db.Column(db.String(32))
    def __repr__(self):
        return f'<User id={self.id} name={self.name}>'

将各种视图文件放到该有的文件下

# pro_name/user/__init__.py
from flask.blueprints import Blueprint
user_bp = Blueprint('user',__name__)
from pro_name.user import view


# pro_name/user/view.py
from flask.views import MethodView
from flask import request,render_template
from pro_name.models import User
from pro_name.user import user_bp
class LoginView(MethodView):
    def _jump(self,msg = None):
        return render_template('login.html',msg = msg)

    def get(self,msg = None):
        return self._jump()

    def post(self):
        uname = request.form.get('name')
        pwd = request.form.get('pwd')
        user = User.query.filter(User.name ==uname,User.pwd == pwd).first()
        if user:
            return '登录成功!'
        else:
            return self._jump(msg='登录的用户名或密码错误')

user_bp.add_url_rule('/login/',view_func=LoginView.as_view('login'))

pro_name/__init__.py把组件拼装起来

from config import config
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
db =  SQLAlchemy()
def create_app(model = 'base'):
    app =  Flask(__name__)
    obj = config.get(model)
    app.config.from_object(obj)
    db.init_app(app)
    Migrate(app,db)

    from pro_name.user import user_bp
    app.register_blueprint(user_bp)
    return app

最后在项目的启动文件app.py

from pro_name import create_app

if __name__ == '__main__':
    app = create_app('dev')
    app.run()

报错解决

AssertionError: The sqlalchemy extension was not registered to the current application. Please make sure to call init_app() first.

# 在Migrate(app,db)前加上
db.init_app(app)

cryptography‘ package is required for sha256_password or caching_sha2_password auth methods

安装库

pip install cryptography