Heim  >  Artikel  >  Backend-Entwicklung  >  Detailliertes Beispiel für die Anpassung der Organisationsstruktur (Python)

Detailliertes Beispiel für die Anpassung der Organisationsstruktur (Python)

Y2J
Y2JOriginal
2017-04-26 11:17:081593Durchsuche

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

Der Code der Initialisierungsdatei lautet wie folgt:

from flask import Blueprint

main=Blueprint("main",__name__) # 创建蓝本
from . import errors,views
Derzeit verfügt die Ansichtsmethodendatei nur über eine Indexmethode , der Code lautet wie folgt:

from flask import render_template
from . import main

@main.route("/")
def index():
 return render_template("index.html",site_name='myblog')
Der Fehlerseitencode wird abgekürzt als

Die URL des Haupt-Blueprints verwendet nicht das Präfix

Dann die Anmeldung , Registrierungs- und Abmeldeseiten sind im Berechtigungs-Blueprint (Authentifizierung) konzentriert. Der Berechtigungs-Blueprint-Initialisierungscode lautet wie folgt:

from flask import Blueprint

auth=Blueprint("auth",__name__)
from . import views
Die Ansicht wird hauptsächlich aus der zuvor abgeschlossenen Ansicht migriert:

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))
Achten Sie auf die beiden mit einem Sternchen markierten Zeilen. Achten Sie unbedingt auf die py-Datei und das py-Objekt. Das Objekt muss in die Datei importiert werden.

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("登录")
Der Code in der Benutzerdatei lautet wie folgt:

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"))
Beachten Sie, dass das Flask-Plug-In von flask.ext importiert wird.* Wechseln Sie zur Methode flask_* Von der neuen Version empfohlen. Ich möchte mich bei meinem Bloggerkollegen Zhi Dian Xiaobaicai für die Erinnerung bedanken.

Natürlich muss der Blueprint am Ende registriert werden, daher lautet der endgültige Code der Methode create_app:

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
Die letzte Änderung ist die Möglichkeit, den Vorgang zu starten, eine zu erstellen Neue Datei „manager.py“ und Konfiguration. Der Startcode lautet wie folgt:

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()
Verwenden Sie die einfachste Art, ihn auszuführen. Das Ergebnis ist das gleiche wie bei der Verwendung von „default.py“. Das Systemverzeichnis lautet derzeit nur zu Referenzzwecken wie folgt:

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn