조직구조 조정 상세예(파이썬)

Y2J
풀어 주다: 2017-04-26 11:17:08
원래의
1599명이 탐색했습니다.

Flask 기반 웹 애플리케이션의 탄생은 일곱 번째 기사입니다. 이 기사는 주로 조직 구조의 조정을 소개하며 관심 있는 친구는

지금 모든 Py를 참조할 수 있습니다. 모두 default.py 파일에 작성됩니다. 분명히 이 방법에서는 프로그램이 책임을지게 되면 개발과 유지 관리 모두에 많은 문제가 발생합니다.

Flask 프레임워크는 프로젝트에 특정 조직 구조를 사용하도록 강요하지 않으므로 여기서 사용되는 조직 구조가 반드시 다른 프로젝트의 조직 구조와 동일할 필요는 없습니다.

default.py의 코드에 따르면 크게 폼 모델, 데이터 모델, 뷰 메서드 3가지로 구분할 수 있으므로 모델도 이것으로 구분합니다. 범주. 따라서 다른 언어(java)에서 얻은 경험에 따르면 각 클래스는 py 파일이며 해당 폴더

에 단일 파일에 배치되며, 모든 구성은 모두 단일 파일에 작성됩니다. 다중 파일 재구성을 수행한 후에는 분명히 부적절하므로 독립적인 구성 파일을 생성해야 합니다:

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"
로그인 후 복사

그런 다음 초기화 파일( 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
로그인 후 복사

추가 모듈화에는 블루프린트의 사용이 필요합니다. 블루프린트의 기능은 asp.net mvc의 영역과 다소 유사하며, 다양한 모듈의 보기 방법을 통합하고 URL을 통해 구별합니다. , 먼저 입구, 즉 인덱스 페이지를 메인 설계도로 정의합니다. 방법은 다음과 같습니다.

  • 메인 폴더를 생성합니다

  • 폴더에 새 Blueprint 초기화 파일을 생성_ _init__.py

  • 뷰 메서드 파일 view.py 생성

  • 오류 페이지 생성 view methoderrors.py
    <🎜 in the main blueprint >

초기화 파일 코드는 다음과 같습니다.

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=&#39;myblog&#39;)
로그인 후 복사

오류 페이지 코드가 생략되었습니다

메인 블루프린트의 URL은 접두어

를 사용하지 않고 로그인, 등록 및 로그아웃 페이지는 권한 청사진(auth)에 집중되어 있습니다. 권한 청사진 초기화 코드는 다음과 같습니다:

from flask import Blueprint

auth=Blueprint("auth",__name__)
from . import views
로그인 후 복사

뷰는 주로 Migrate 이전에 완료된 뷰입니다:

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))
로그인 후 복사

별표가 표시된 두 줄에 주의하세요. py 파일과 py 객체를 주의하세요.

LoginForm 파일의 코드는 다음과 같습니다.

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"))
로그인 후 복사

Flask 플러그인 가져오기 방식이 Flask.ext.*에서 에서 권장하는 Flask_* 방식으로 변경되었습니다. 새 버전입니다. Yuji Electric Cabbage가 알려드립니다.

물론 마지막에 Blueprint를 등록해야 하므로 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
로그인 후 복사

마지막 수정은 작업을 시작하는 방식입니다. .py 파일을 생성하고 시작 코드를 다음과 같이 구성합니다.

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()
로그인 후 복사
가장 소박한 방법으로 실행하면 실행 결과는 default.py만 있을 때와 같습니다. 참고용으로 다음과 같습니다.

위 내용은 조직구조 조정 상세예(파이썬)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿