一個web應用的誕生(7)

來源:互聯網
上載者:User

標籤:項目   整合   errors   pass   field   外掛程式   自己   版本   app   

現在所有的Py代碼均寫在default.py檔案中,很明顯這種方法下,一旦程式變的負責,那麼無論對於開發和維護來說,都會帶來很多問題。

Flask架構並不強制要求項目使用特定的組織圖,所以這裡使用的組織圖並不一定與其它項目中相同。

根據default.py中的代碼,大體可分為三類:表單模型,資料模型,視圖方法,所以模型也網這類中來區分。所以按照其他語言(java)得來的經驗,每個類為一個py檔案,放到相應的檔案夾中

在單個檔案中,所有的配置都寫在單個的檔案裡,而在進行多檔案重構之後,還這樣做很明顯是不合適的,所以建立一個獨立的config檔案很有必要:

class Config:    SECRET_KEY="Niu_blog String"    SQLALCHEMY_DATABASE_URI=‘mysql://root:[email protected]/cblog‘    SQLALCHEMY_COMMIT_ON_TEARDOWN=True    LOGIN_PROTECTION="strong"    LOGIN_VIEW="login"

然後是初始設定檔案(app/__init__.py):

from flask import Flaskfrom flask_bootstrap import Bootstrapfrom flask_sqlalchemy import SQLAlchemyfrom flask_login import LoginManagerimport pymysqlpymysql.install_as_MySQLdb()from config import Configbootstrap = 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中的area,將不同模組的視圖方法整合到一起,並通過url進行區分,首先入口即index頁面定義為main藍本,方法如下:

  1. 建立main檔案夾
  2. 檔案夾內建立藍本初始設定檔案__init__.py
  3. 建立視圖方法檔案view.py
  4. 主藍本內建立錯誤頁視圖方法errors.py

初始設定檔案代碼如下:

from flask import Blueprintmain=Blueprint("main",__name__) # 建立藍本from . import errors,views

目前,視圖方法檔案只有一個index方法,代碼如下:

from flask import render_templatefrom . import main@main.route("/")def index():    return render_template("index.html",site_name=‘myblog‘)

錯誤頁代碼略

主藍本的的URL不使用首碼

然後登陸註冊登出頁集中到許可權藍本(auth),許可權藍本初始化代碼如下:
from flask import Blueprint

auth=Blueprint("auth",__name__)from . import views    

視圖主要為之前已經完成的視圖遷移過來:

from . import authfrom .. import  db,login_managerfrom ..forms.LoginForm import LoginForm(*)from ..models.User import User (*)from flask_login import login_user,logout_userfrom 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_loaderdef load_user(user_id):    return User.query.get(int(user_id))

注意打星號標記的兩行,一定要注意py檔案和py對象,必須在檔案內在import對象

其中LoginForm檔案內的代碼如下:

from flask_wtf import FlaskFormfrom wtforms import StringField,PasswordField,SubmitField,BooleanFieldfrom wtforms.validators import DataRequiredclass LoginForm(FlaskForm):    username=StringField("請輸入使用者名稱",validators=[DataRequired()])    password=PasswordField("請輸入密碼")    remember_me=BooleanField("記住我")    submit=SubmitField("登入")

User檔案內的代碼如下:

from flask_login import UserMixinfrom  ..  import dbclass 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_*這種方式,在此感謝博友 治電小白菜的提醒。

當然,最終還要對藍本進行註冊,所以最終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

最後修改的是啟動啟動並執行方式,建立一個manager.py檔案,配置啟動代碼如下:

from app import create_app, dbfrom flask_script import Manager,Shellfrom flask_migrate import Migrate,MigrateCommandfrom app.models.User import Userfrom app.models.Role import Roleimport pymysqlpymysql.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()

用最土的方式,跑跑運行一下,運行結果與之前僅有default.py的時候相同,此時系統目錄如下,僅供參考:

此章並沒有多少新東西,主要是對之前的系統目錄,系統結構做一些調整,這周比較忙,要準備應聘,準備面試,緊趕慢趕總算至少完成了對自己的承諾,每周一篇blog,不過如果按照發布時間來說,貌似還是晚了一天,畢竟現在已經過了0點:(

一個web應用的誕生(7)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.