以此結構為例,這個小項目是《Flask Web開發:基於python的web應用開發實戰》第一部分結束后的代碼框架
第一層
有app、tests、migrations三個文件夾和config.py、manage.py兩個py文件以及data-dev.sqlite、data-tests.sqlite兩個sqlite數據庫
app文件夾下主要寫flask程序;
migrations 文件夾包含數據庫遷移腳本;
tests文件夾下編寫單元測試;
config.py用來存儲配置
manage.py 用於啟動程序以及其他的程序任務
data-dev.sqlite是程序運行時所用的數據庫
data-tests.sqlite是單元測試所使用的數據庫
app層
下面有main、static、templates三個文件夾以及__init__.py、email.py、models.py三個py文件
main文件夾用來保存藍本,此文件夾下__inir__.py文件里面創建藍本,( 藍本和程序類似,也可以定義路由。不同的是,在藍本中定義的路由處於休眠狀態,直到藍本注冊到程序上后,路由才真正成為程序的一部分。)main文件夾下views.py用來保存程序的路由,errors.py用來處理錯誤,forms.py是存放表單定義
static存放靜態文件
templates用來存放響應的html文件,mail子文件里面的用來保存發送郵件所需的.html和.txt文件
__inir__.py文件里面包含create_app()函數,已經app的各種初始化
email.py包含send_email()發送文件函數(異步)
models.py包含User和Role兩個表定義
tests層
test_basics.py用來編寫單元測試
應該還有一個venv文件夾用來包含虛擬環境和一個requirements.txt 文件,此文件列出了所有依賴包,便於在其他電腦中重新生成相同的虛擬環境
個人需掌握
config.py中含有一個基類Config定義,三個繼承類定義DevlopmentConfig、TestingConfig、ProductionConfig和一個元組config
manage.py中含有app 創建,manage、migrate初始化,以及make_shell_context()函數在命令行獲取上下文,避免頻繁導入還有test()函數,用來測試。
app下__init__.py文件含有create_app()函數,部分代碼有
bootstrap = Bootstrap() mail = Mail() moment = Moment() db = SQLAlchemy() def create_app(config_name): #創建app app = Flask(__name__) app.config.from_object(config[config_name]) #將配置類中的配置導入程序 config[config_name].init_app(app) bootstrap.init_app(app) mail.init_app(app) moment.init_app(app) db.init_app(app) from .main import main as main_blueprint #導入藍本main app.register_blueprint(main_blueprint) #在主程序中注冊藍本 return app
app.config.from_object(config[config_name]) 將配置類中的配置導入程序!!
在email中利用有這樣一行代碼
app = current_app._get_current_object()
current_app程序上下文!!!,理解有些模糊
在app/main/views下有一段代碼比較重要
@main.route('/',methods = ['POST','GET']) #請求方式不管是post還是get都執行這個視圖函數 def index(): form = NameForm() #表單實例 if form.validate_on_submit(): #提交按鈕是否成功點擊 # 從數據庫中查找和表單數據一樣的數據,如果有,取第一個數據 user = User.query.filter_by(username = form.name.data).first() if user is None: #如果數據庫中沒有對應的數據 user = User(username = form.name.data) #在數據庫中對應的表中創建數據 db.session.add(user) #加入到用戶會話,以便數據庫進行提交 session['known'] = False #這是一個新用戶 if current_app.config['FLASKY_ADMIN']: #如果收件人已經定義,則調用發送郵件函數 send_email(current_app.config['FLASKY_ADMIN'],'New User','mail/new_user',user = user) flash('The mail has been sent out') else: session['known'] = True #這是一個老用戶 session['name'] = form.name.data #從表單獲取數據 return redirect(url_for('.index')) return render_template('index.html',current_time = datetime.utcnow(), form = form,name=session.get('name'),known
以上全是個人理解,初次接觸,學藝不精
2016-08-29