Die Geburt einer flaschenbasierten Webanwendung ist der siebte Artikel, der hauptsächlich die Anpassung der Organisationsstruktur vorstellt und einen gewissen Referenzwert hat.
Alle Py-Codes sind Alles in der Datei default.py geschrieben. Sobald das Programm verantwortlich ist, verursacht es natürlich viele Probleme sowohl bei der Entwicklung als auch bei der Wartung.
Das Flask-Framework zwingt Projekte nicht dazu, eine bestimmte Organisationsstruktur zu verwenden, daher ist die hier verwendete Organisationsstruktur nicht unbedingt dieselbe wie in anderen Projekten.
Gemäß dem Code in default.py kann es grob in drei Kategorien unterteilt werden: Formularmodell, Datenmodell und Ansichtsmethode, sodass Modelle auch dadurch unterschieden werden Kategorie. Daher ist nach den Erfahrungen aus anderen Sprachen (Java) jede Klasse eine Py-Datei und wird im entsprechenden Ordner abgelegt
In einer einzigen Datei, Alle Konfigurationen werden alle in eine einzige Datei geschrieben, und nach der Rekonstruktion mehrerer Dateien ist dies offensichtlich unangemessen, daher ist es notwendig, eine unabhängige Konfigurationsdatei zu erstellen:
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"
Dann initialisieren Sie die Datei (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
Eine weitere Modularisierung erfordert die Verwendung von Blueprints. Die Funktionen von Blueprints ähneln in gewisser Weise den Bereichen in asp.net mvc und integrieren die Ansichtsmethoden verschiedener Module URL, zuerst wird der Eingang, also die Indexseite, als Hauptblaupause definiert. Die Methode ist wie folgt:
Erstellen Sie den Hauptordner
Erstellen Sie einen neuen Ordner in der Blueprint-Initialisierungsdatei __init__.py
Ansichtsmethodendatei view.py erstellen
Fehlerseitenansichtsmethode erstellen Fehler.py< im Hauptentwurf 🎜>
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))
Der Code in der LoginForm-Datei lautet wie folgt :
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()
Das obige ist der detaillierte Inhalt vonDetailliertes Beispiel für die Anpassung der Organisationsstruktur (Python). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!