Exemple détaillé d'ajustement de la structure organisationnelle (python)

Y2J
Libérer: 2017-04-26 11:17:08
original
1599 Les gens l'ont consulté

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"
Copier après la connexion

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
Copier après la connexion

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 🎜>

Le code du fichier d'initialisation est le suivant :

from flask import Blueprint

main=Blueprint("main",__name__) # 创建蓝本
from . import errors,views
Copier après la connexion
Actuellement, le fichier de méthode d'affichage n'a qu'une seule méthode d'indexation , le code est le suivant :

from flask import render_template
from . import main

@main.route("/")
def index():
 return render_template("index.html",site_name=&#39;myblog&#39;)
Copier après la connexion
Le code de la page d'erreur est abrégé en

L'URL du plan principal n'utilise pas le préfixe

Puis la connexion. , les pages d'enregistrement et de déconnexion sont concentrées dans le plan d'autorisation (auth). Le code d'initialisation du plan d'autorisation est le suivant :

from flask import Blueprint

auth=Blueprint("auth",__name__)
from . import views
Copier après la connexion
La vue est principalement migrée à partir de la vue précédemment complétée :

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))
Copier après la connexion
Faites attention aux deux lignes marquées d'un astérisque. Assurez-vous de faire attention au fichier py et à l'objet py.

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("登录")
Copier après la connexion
Le code dans le fichier User est le suivant :

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"))
Copier après la connexion
Notez que le plug-in flask est importé par flask.ext.* Passage à la méthode flask_* recommandé par la nouvelle version. Je tiens à remercier mon collègue blogueur Zhi Dian Xiaobaicai pour le rappel.

Bien sûr, le plan doit être enregistré à la fin, donc le code final de la méthode create_app est :

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
Copier après la connexion
La dernière modification est la manière de démarrer l'opération, créer un nouveau fichier manager.py et configurez Le code de démarrage est le suivant :

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__ ==&#39;__main__&#39;:
 manager.run()
Copier après la connexion
Utilisez la manière la plus rustique de l'exécuter. Le résultat d'exécution est le même que lorsqu'il n'y avait que default.py. heure, le répertoire système est le suivant, à titre de référence uniquement :

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal