# Flask實作_建置一個使用者註冊頁面_03_調整專案架構 ###### tags: `python` `flask` 在[Flask實作_建置一個使用者註冊頁面_02_專案架構說明](https://hackmd.io/s/HyP-nW9mf)討論完flask的專案架構之後,我們就可以著手調整自己手上的專案,兩個範例,一個是簡單架構,另一個為模組導向架構,後續的專案開發我們會以『模組導向架構』來執行。 ## 作業說明 ### 簡單架構 ``` /flask_blog /app_blog /static /data data_register.sqlite /templates register.html __init__.py model.py form.py view.py manager.py ``` * static: 用來放置靜態資源的資料夾,如JS、CSS... * templates: 放置模板(Html)的資料夾 * `manager.py`: 專案執行主要Python文件 * `app_blog\__init__.py`: 專案中相關Package初始化設置於此 :::success * 文件:app_blog\\_\_init\_\_.py * 說明:加入\\_\_init\_\_.py,將app\_blog變成Package之後將所有初始化設置於此 ```python= from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_bootstrap import Bootstrap import os # 取得啟動文件資料夾路徑 pjdir = os.path.abspath(os.path.dirname(__file__)) app = Flask(__name__) # 新版本的部份預設為none,會有異常,再設置True即可。 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True # 設置資料庫為sqlite3 app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + \ os.path.join(pjdir, 'static\\data\\data_register.sqlite') app.config['SECRET_KEY']='your key' bootstrap = Bootstrap(app) db = SQLAlchemy(app) # 很重要,一定要放這邊 from app_blog import view ``` 第16行:隱密性的參數請記得以環境變數設置,但實作範例上會以明碼方式設置 第21行:View的import一定要放後面,Python是個直述式語言,如果把View放在最上面去import會造成錯誤,原因是你View內的相關物件這時候根本還沒有初始化生成,無從import。 ```python= # 這是view.py的import from app_blog import app from app_blog import db from flask import render_template from app_blog.model import UserReister from app_blog.form import FormRegister ``` ::: :::success * 文件:app\_blog\\model.py * 說明:Model異動幅度不大,單純移動檔案位置 ```python= from app_blog import db class UserReister(db.Model): # 如果沒有設置__tablename__的話會依class的名稱產生table name __tablename__ = 'UserRgeisters' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(30), unique=True, nullable=False) email = db.Column(db.String(50), unique=True, nullable=False) password = db.Column(db.String(50), nullable=False) def __repr__(self): return 'username:%s, email:%s' % (self.username, self.email) ``` ::: :::success * 文件:app\_blog\\form.py * 說明:調整Form ```python= from flask_wtf import Form from wtforms import StringField, SubmitField, validators, PasswordField, ValidationError from wtforms.fields.html5 import EmailField from app_blog.model import UserReister #...下略...# ``` ::: :::success * 文件:app\_blog\\view.py * 說明:調整View ```python= from app_blog import app from app_blog import db from flask import render_template from app_blog.model import UserReister from app_blog.form import FormRegister #...下略...# ``` ::: :::success * 文件:manager.py * 說明:加入啟動文件 ```python= from app_blog import app app.debug = True app.run() ``` ::: 調整之後,整個專案架構就更為明確,需要加Form就去`form.py`、需要Model就去`model.py`、需要View就去`view.py`。這是較為簡單的基礎架構,如果預期專案很大的話,記得依需求選擇功能架構或是模組架構來建置。 這時候可以先利用python shell確認一下目前的路由是否正常,如下: ```python= >>> from app_blog import app >>> app.url_map ``` 第2行:透過`app.url_map`可以查詢專案所有路由清單 ### 模組導向 後續的專案建置會以模組導向來設置,因此我們利用上面的基礎架構來調整,調整之後架構如下: ``` /flask_blog /app_blog /author __init__.py model.py form.py view.py /static /data data_register.sqlite /templates /author register.html __init__.py config.py # 後續說明 manager.py ``` 以模組導向來設置專案,因此我們加入一個資料夾,命名為『author』,並將相關的『View、Model、Form』移至該資料夾,並且同步在『templates』內新增資料夾,也命名為『author』。 唯一調整就是import的部份再加個`.author`,也因為『templates』加了一個『author』的資料夾,所以在`render_tamplate`設置的Html文件路徑也要加入資料夾路徑『author/』。 :::success * 文件:app\_blog\\author\\form.py * 說明:調整form的import * ```python= from flask_wtf import FlaskForm from wtforms import StringField, SubmitField, validators, PasswordField, ValidationError from wtforms.fields.html5 import EmailField from app_blog.author.model import UserReister #...下略...# ``` 第4行:import調整為app_blog.author.model ::: :::success * 文件:app\_blog\\author\\model.py * 說明:未有異動 ::: :::success * 文件:app\_blog\\author\\view.py * 說明:調整view的import與樣板路徑 ```python= from app_blog import app from app_blog import db from flask import render_template from app_blog.author.model import UserReister from app_blog.author.form import FormRegister @app.route('/register', methods=['GET', 'POST']) def register(): form = FormRegister() if form.validate_on_submit(): user = UserReister( username=form.username.data, email=form.email.data, password=form.password.data ) db.session.add(user) db.session.commit() return 'Success Thank You' return render_template('author/register.html', form=form) ``` 第4、5行:調整import 第20行:調整樣板路徑,加入『author/』 ::: :::success * 文件:app_blog\\_\_init\_\_.py * 說明:未有異動 ::: :::success * 文件:manager.py * 說明:未有異動 ::: ## 總結 將專案調整為模組導向之後,後續如有需求新增模組可直接加入一個新的資料夾,並且設置為Package,加入\_\_init\_\_、Form、View、Model,並且記得templates加上相對應的資料夾名稱即可。 在這次的調整中我們加入了新的文件`config.py`,它的用途主要為設置專案參數使用,下一節我們一起來瞭解如何處理。 **上一話:**[Flask實作_建置一個使用者註冊頁面_02_專案架構說明](https://hackmd.io/s/HyP-nW9mf) **下一話:**[Flask實作_建置一個使用者註冊頁面_04_調整系統配置](https://hackmd.io/s/ryXdT527z)