### 導航
- [索引](# "總目錄")
- [下一頁](# "步驟 6: 模板") |
- [上一頁](# "步驟 4: 請求數據庫連接") |
- [Flask 0.10.1 文檔](#) ?
- [教程](#) ?
# 步驟 5: 視圖函數
現在數據庫連接已經正常工作,我們終于可以開始寫視圖函數了。我們一共需要寫四個:
### 顯示條目
這個視圖顯示數據庫中存儲的所有條目。它綁定在應用的根地址,并從數據庫查詢出文章的標題和正文。id 值最大的條目(最新的條目)會顯示在最上方。從指針返回的行是按 select 語句中聲明的列組織的元組。這對像我們這樣的小應用已經足夠了,但是你可能會想把它轉換成字典。如果你對這方面有興趣,請參考 [*簡化查詢*](#)的例子。
視圖函數會將條目作為字典傳遞給 show_entries.html 模板,并返回渲染結果:
~~~
@app.route('/')
def show_entries():
cur = g.db.execute('select title, text from entries order by id desc')
entries = [dict(title=row[0], text=row[1]) for row in cur.fetchall()]
return render_template('show_entries.html', entries=entries)
~~~
### 添加條目
這個視圖允許已登入的用戶添加新條目,并只響應 POST 請求,實際的表單顯示在show_entries 頁。如果一切工作正常,我們會用 [flash()](# "flask.flash") 向下一次請求發送提示消息,并重定向回 show_entries 頁:
~~~
@app.route('/add', methods=['POST'])
def add_entry():
if not session.get('logged_in'):
abort(401)
g.db.execute('insert into entries (title, text) values (?, ?)',
[request.form['title'], request.form['text']])
g.db.commit()
flash('New entry was successfully posted')
return redirect(url_for('show_entries'))
~~~
注意這里的用戶登入檢查( logged_in 鍵在會話中存在,并且為 True )
安全提示
確保像上面例子中一樣,使用問號標記來構建 SQL 語句。否則,當你使用格式化字符串構建 SQL 語句時,你的應用容易遭受 SQL 注入。更多請見 [*在 Flask 中使用 SQLite 3*](#) 。
### 登入和登出
這些函數用來讓用戶登入登出。登入通過與配置文件中的數據比較檢查用戶名和密碼,并設定會話中的 logged_in 鍵值。如果用戶成功登入,那么這個鍵值會被設為True ,并跳轉回 show_entries 頁。此外,會有消息閃現來提示用戶登入成功。如果發生一個錯誤,模板會通知,并提示重新登錄。
~~~
@app.route('/login', methods=['GET', 'POST'])
def login():
error = None
if request.method == 'POST':
if request.form['username'] != app.config['USERNAME']:
error = 'Invalid username'
elif request.form['password'] != app.config['PASSWORD']:
error = 'Invalid password'
else:
session['logged_in'] = True
flash('You were logged in')
return redirect(url_for('show_entries'))
return render_template('login.html', error=error)
~~~
登出函數,做相反的事情,從會話中刪除 logged_in 鍵。我們這里使用了一個簡潔的方法:如果你使用字典的 [pop()](http://docs.python.org/dev/library/stdtypes.html#dict.pop "(在 Python v3.5)") [http://docs.python.org/dev/library/stdtypes.html#dict.pop] 方法并傳入第二個參數(默認),這個方法會從字典中刪除這個鍵,如果這個鍵不存在則什么都不做。這很有用,因為我們不需要檢查用戶是否已經登入。
~~~
@app.route('/logout')
def logout():
session.pop('logged_in', None)
flash('You were logged out')
return redirect(url_for('show_entries'))
~~~
繼續 [*步驟 6: 模板*](#) 。
? 版權所有 2013, Armin Ronacher.
- 歡迎使用 Flask
- 前言
- 給有經驗程序員的前言
- 安裝
- 快速入門
- 教程
- 介紹 Flaskr
- 步驟 0: 創建文件夾
- 步驟 1: 數據庫模式
- 步驟 2: 應用設置代碼
- 步驟 3: 創建數據庫
- 步驟 4: 請求數據庫連接
- 步驟 5: 視圖函數
- 步驟 6: 模板
- 步驟 7: 添加樣式
- 福利: 應用測試
- 模板
- 測試 Flask 應用
- 記錄應用錯誤
- 配置處理
- 信號
- 即插視圖
- 應用上下文
- 請求上下文
- 用藍圖實現模塊化的應用
- Flask 擴展
- 與 Shell 共舞
- Flask 代碼模式
- 大型應用
- 應用程序的工廠函數
- 應用調度
- 使用 URL 處理器
- 部署和分發
- 使用 Fabric 部署
- 在 Flask 中使用 SQLite 3
- 在 Flask 中使用 SQLAlchemy
- 上傳文件
- 緩存
- 視圖裝飾器
- 使用 WTForms 進行表單驗證
- 模板繼承
- 消息閃現
- 用 jQuery 實現 Ajax
- 自定義錯誤頁面
- 延遲加載視圖
- 在 Flask 中使用 MongoKit
- 添加 Favicon
- 數據流
- 延遲請求回調
- 添加 HTTP Method Overrides
- 請求內容校驗碼
- 基于 Celery 的后臺任務
- 部署選擇
- mod_wsgi (Apache)
- 獨立 WSGI 容器
- uWSGI
- FastCGI
- CGI
- 聚沙成塔
- API
- JSON 支持
- Flask 中的設計決策
- HTML/XHTML 常見問題
- 安全注意事項
- Flask 中的 Unicode
- Flask 擴展開發
- Pocoo 風格指引
- Python 3 支持
- 升級到最新版本
- Flask Changelog
- 許可證
- 術語表