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