在台灣接觸似乎使用Python 架設網站都會以Django為首選,
但是因為我是一開始學習Flask開始的,
所以一直到現在我用Python 開發網站還是會選擇Flask,
因為他輕(他只有包含了兩個lib ,jinja2 and uwsgi),
不管在連結資料庫(MongoDB, MySQL.....)都有相對應的軟體套件,
而且我也喜歡Python 的寫作風格,
少了大括號不單是減少了許多行數,
強制縮排更是會讓程式碼更容易閱讀。
Flask的基本使用部份我應該就沒有在這次的鐵人賽中紀錄了,
若有需要請洽官方網站。
而DataBase我選用MongoDB的原因除了它現在是目前NoSQL的大宗之外,
也只是因為我跟他最熟!
第一次參與比賽當然要跟最熟的一起搭檔,
基本使用與安裝也請洽官方網站,
我的目標是建立一個API,
因為我之前有一些作品我想要寫一個API把他們串連起來,
其中有些作品是Nodejs寫的,
所以可能內容會參雜部份的Javascript。
-----------------------------打屁結束---------------------------------------
在規劃網站的最初遇到的第一個問題通常是表單,
我選用了Flask-WTF來解決這塊問題,
其實Flask-WTF主要使用了WTforms在外層在包一層wrapper,
所以核心還是以WTforms為主,
需要注意的是Flask-WTF 的module中只有維護Form,
而其他的欄位請使用WTForms中的module。
因為WTForms提供Validate與Custome Form的規範,
針對相對應的欄位作不同的限制,
而減少前端javascript coding 的數量,
相同的Form表單或是欄位都可以重複使用,
減少未來的維護成本。
並且在Flask-mongoengin的schema配對中,
可以有相當高程度的耦合,
讓前後端的資料傳遞單純化,
而前端所需要重視的只是頁面上的美化與顯示。
以下是簡單的Falsk-WTF Sample Code
包含了Custom Email Input,
檢查欄位是否空值,
以及檢查資料庫中是否有此使用者,
_get_user 這個funciton 因為牽涉到資料庫的搜索,
所以今天先按下不表!
以上謝謝各位!
#-*- coding:utf-8 -*-
from flask.ext.wtf import Form
from wtforms.widgets import Input
from wtforms import TextField, PasswordField
from wtforms.validators import InputRequired, ValidationError
class EmailInput(Input):
"""
render a email input
"""
input_type='email'
class EmailField(StringField):
"""
custom email field
"""
widget=EmailInput()
class EditUserForm(Form):
'''
Create user form
'''
account = TextField(u"Account", validators=[InputRequired(message=u"Enter right account, please.")])
pwd = TextField(u"Password", validators=[InputRequired(message=u'Password could not be empty.')])
email = EmailField(u'Email')
def _get_user(self):
try:
user = User.objects(account=self.account.data).first()
except MultipleObjectsReturned: #if two sections have the same name
user = user[0]
return user
def validate_account(self, field):
if self._get_user() is not None:
raise ValidationError(u"此帳號已被註冊")