La naissance d'une application Web basée sur flask est le septième article. Cet article présente principalement l'ajustement de la structure organisationnelle et a une certaine valeur de référence. Les amis intéressés peuvent se référer à
Tous les codes Py sont maintenant. le tout écrit dans le fichier default.py. Évidemment, avec cette méthode, une fois que le programme deviendra responsable, cela posera de nombreux problèmes de développement et de maintenance.
Le framework Flask n'oblige pas les projets à utiliser une structure organisationnelle spécifique, donc la structure organisationnelle utilisée ici n'est pas nécessairement la même que dans d'autres projets.
Selon le code de default.py, il peut être grossièrement divisé en trois catégories : modèle de formulaire, modèle de données et méthode d'affichage, les modèles se distinguent donc également par ceci catégorie. Par conséquent, selon l'expérience acquise dans d'autres langages(java), chaque classe est un fichier py et placée dans le dossier correspondant
Dans un seul fichier, toutes les configurations Toutes sont écrites dans un seul fichier, et après reconstruction multi-fichiers, il est évidemment inapproprié de faire cela, il faut donc créer un fichier de configuration indépendant :
class Config: SECRET_KEY="Niu_blog String" SQLALCHEMY_DATABASE_URI='mysql://root:1234@localhost/cblog' SQLALCHEMY_COMMIT_ON_TEARDOWN=True LOGIN_PROTECTION="strong" LOGIN_VIEW="login"
Puis initialiser File (app /__init__.py) :
from flask import Flask from flask_bootstrap import Bootstrap from flask_sqlalchemy import SQLAlchemy from flask_login import LoginManager import pymysql pymysql.install_as_MySQLdb() from config import Config bootstrap = Bootstrap() db = SQLAlchemy() login_manager=LoginManager(); def create_app(): app = Flask(__name__) app.config.from_object(Config) bootstrap.init_app(app) login_manager.init_app(app) login_manager.session_protection=Config.LOGIN_PROTECTION login_manager.login_view=Config.LOGIN_VIEW db.init_app(app) return app
Une modularisation plus poussée nécessite l'utilisation de plans. Les fonctions des plans sont quelque peu similaires aux zones d'asp.net mvc, intégrant les méthodes d'affichage des différents modules et se distinguant par. url, d'abord l'entrée, c'est-à-dire que la page d'index est définie comme le plan principal. La méthode est la suivante :
Créer le dossier principal
Créez un nouveau dossier dans le fichier d'initialisation Blueprint __init__.py
Créez le fichier de méthode d'affichage view.py
Créez la méthode d'affichage de la page d'erreur error.py< dans le plan principal 🎜>
from flask import Blueprint main=Blueprint("main",__name__) # 创建蓝本 from . import errors,views
from flask import render_template from . import main @main.route("/") def index(): return render_template("index.html",site_name='myblog')
from flask import Blueprint auth=Blueprint("auth",__name__) from . import views
from . import auth from .. import db,login_manager from ..forms.LoginForm import LoginForm(*) from ..models.User import User (*) from flask_login import login_user,logout_user from flask import render_template,flash,redirect,url_for @auth.route("/login",methods=["GET","POST"]) def login(): form = LoginForm() print(url_for("main.index")) if form.validate_on_submit(): username = form.username.data password = form.password.data print(User) user = User.query.filter_by(username=username, password=password).first() if user is not None: login_user(user, form.remember_me.data) print(url_for("main.index")) return redirect(url_for("main.index")) else: flash("您输入的用户名或密码错误") return render_template("/auth/login.html", form=form) # 返回的仍为登录页 return redirect(url_for("main.index")) return render_template("/auth/login.html",form=form) @auth.route("/logout",methods=["GET","POST"]) def logout(): logout_user() return redirect(url_for("main.index")) @login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id))
Le code dans le fichier LoginForm est le suivant. :
from flask_wtf import FlaskForm from wtforms import StringField,PasswordField,SubmitField,BooleanField from wtforms.validators import DataRequired class LoginForm(FlaskForm): username=StringField("请输入用户名",validators=[DataRequired()]) password=PasswordField("请输入密码") remember_me=BooleanField("记住我") submit=SubmitField("登录")
from flask_login import UserMixin from .. import db class User(UserMixin,db.Model): __tablename__="users" id=db.Column(db.Integer,primary_key=True) username=db.Column(db.String(50),unique=True,index=True) password=db.Column(db.String(50)) nickname=db.Column(db.String(50)) email=db.Column(db.String(100)) birthday=db.Column(db.DateTime) gender=db.Column(db.Integer) remark=db.Column(db.String(200)) role_id=db.Column(db.Integer,db.ForeignKey("roles.id"))
def create_app(): app = Flask(__name__) app.config.from_object(Config) bootstrap.init_app(app) login_manager.init_app(app) login_manager.session_protection=Config.LOGIN_PROTECTION login_manager.login_view=Config.LOGIN_VIEW db.init_app(app) from .main import main as main_blueprint from .auth import auth as auth_blueprint app.register_blueprint(main_blueprint) #无url前缀 app.register_blueprint(auth_blueprint,url_prefix="/auth") #url前缀为/auth return app
from app import create_app, db from flask_script import Manager,Shell from flask_migrate import Migrate,MigrateCommand from app.models.User import User from app.models.Role import Role import pymysql pymysql.install_as_MySQLdb() app=create_app() manager=Manager(app); migrate = Migrate(app, db) def make_shell_context(): return dict(app=app,db=db,User=User,Role=Role) #注册shell命令 manager.add_command("db", MigrateCommand) #新增db命令用于数据库迁移 manager.add_command("shell" ,Shell(make_context=make_shell_context())) if __name__ =='__main__': manager.run()
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!