# 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)