Flask 從入門到實踐

Flask 從入門到實踐

路由的介紹

程序實例保存了一個URL到Python程序的映射關係,處理URL和函數之間關係的程序成爲路由javascript

使用程序實例的app.route裝飾器便可把要修飾的函數(可稱爲視圖函數,下例中爲index(),user())註冊爲路由。css

from flask import Flask
from flask import request

app = Flask(__name__)


@app.route('/')
def index():
    return '<h1>Hello World!</h1>'

@app.route('/user/<name>')
def user(name):
    return '<h1>Hello, %s !</h1>' %name

@app.route('/users/<int:id>')
def users(id):
    return '<h1>Your ID is : %d !</h1>' %id

@app.route('/info/')
def info():
    user_agent = request.headers.get('User-Agent')
    return '<p>Your browser is %s</p>' % user_agent

  
if __name__ == '__main__':
    app.run(debug=True)

Flask上下文全局變量

變量名 上下文 說明
current_app 程序上下文 當前激活程序的程序實例
g 程序上下文 處理請求時用做臨時存儲的對象,每次請求會重設該變量
request 請求上下文 請求對象,封裝了客戶端發出的HTTP請求中的內容
session 請求上下文 用戶會話,用於存儲請求之間須要「記住」的值的詞典

Flask中有兩種上下文:程序上下文和請求上下文,在調用以前須要先激活。html

視圖函數用來處理客戶端發來的請求,Flask用app.route裝飾器或者非裝飾器的app.add_url_rule() 來生成URL映射。java

在處理請求以前或以後執行處理的代碼稱爲請求鉤子函數,Flask支持如下4種裝飾器來實現:python

  • before_first_request:處理第一個請求前運行
  • before_request:每次請求前運行
  • after_request:如沒有未處理的異常拋出,在每次請求以後運行
  • teardown_request:便是有未處理的異常也在每次請求後運行

在請求析構函數和視圖函數之間共享數據通常使用上下文全局變量 g.web

Flask中可用make_response來自定義響應對象,例如攜帶cookie等:正則表達式

from flask import make_response
@app.route('/cookie/')
def cookie_test():
    response = make_response('<h1>This document carries a cookie!</h1>')
    response.set_cookie('year', '2017')
    return response

302重定向:flask

from flask import redirect
@app.route('/r/')
def redirect():
    return redirect('http://www.hython.com')

處理錯誤的響應用abort函數,若拋出異常則交控制權給web服務器:bootstrap

from flask import abort
@app.route('/user/<id>')
def get_user(id):
    user = load_user(id)
    if not user:
        abort(404)
    return '<h1>Hello, %s</h1>' % user.name

Jinja2模板的使用

Jinja2變量過濾器

過濾器名 說明
safe 渲染值時不轉義
capitalize 把值的首字母轉換成大寫,其他的小寫
lower 把值轉換成小寫形式
upper 把值轉換成大寫形式
title 值中的每一個單詞的首字母轉換成大寫
trim 把值的首尾空格去掉
striptags 渲染以前把值中全部的HTML標籤都刪掉

控制結構

  1. 條件控制語句:if
  2. for循環
  3. 宏函數(macros)

Flask-Bootstrap插件

flask bootstrap基模板中定義的塊

塊名 說明
doc 整個HTML文檔
html_attribs 標籤的屬性
html 標籤中的內容
head 標籤中的內容
title 標籤中的內容</td> </tr>
metas 一組 標籤
styles css樣式表定義
body_attribs 標籤的屬性
body 標籤中的內容
navbar 用戶定義的導航條
content 用戶定義的頁面內容
scripts 文檔底部的JavaScript聲明

若是須要從新定義塊,好比自定義css和js的styles和scripts,需使用jinja2中的super()函數:api

{% block scripts %}
{{ super() }}
<script type="text/javascript" scr="my-script.js"></script>
{% endblock %}

url_for()函數:

# _external=True返回絕對地址:http://127.0.0.1:5000/static/css/styles.css
url_for('static', filename='css/styles.css', _external=True)

Flask-moment插件本地化日期和時間

引入並實例:

from flask.ext.moment import Moment
moment = Moment(app)

base.html中須要引入:

{% block scripts %}
{{ super() }}
{{ moment.include_moment() }}
{{ moment.lang('ja') }}
{% endblock %}

index.html中便可使用:

<p>The Local date and time is {{ moment(current_time).format('LLL') }}.</p>
<p>That was {{ moment(current_time).fromNow(refresh=True) }}</p>

除此以外Flask-Moment實現了moment.js中format(),fromNow(),fromTime(),calendar(),valueOf(),和unix()等方法。具體可參閱官方文檔

Web表單

設置Flask-WTF插件

爲免受跨站僞造請求CSRF的攻擊,須要在app.config設置通用密鑰以下:

app = Flask(__name__)
app.config['SECRET_KEY'] = 'do not guess this string'

其實配置密鑰的變量保存在系統變量中比寫在代碼裏更爲安全。

字段類型 說明
StringField 文本字段
TextAreaField 多行文本字段
PasswordField 密碼文本字段
HiddenField 隱藏文本字段
DateField 文本字段,值爲datetime.date格式
DateTimeField 文本字段,值爲datetime.datetime格式
IntegerField 文本字段,值爲整數
DecimalField 文本字段,值爲decimal.Decimal
FloatField 文本字段,值爲浮點數
BooleanField 複選框
RadioField 一組單選框
SelectField 下拉列表
SelectMultipleField 下拉列表,可選擇多個值
FileField 文本上傳字段
SubmitField 表單提交
FormField 把表單做爲字段嵌入另外一個表單
FormField 一組指定類型的字段

WTForms驗證函數

驗證函數 說明
Email 電子郵件地址
EqualTo 比較兩字段值,經常使用於要求輸入兩次密碼確認
IPAddress 驗證IPv4網絡地址
Length 驗證輸入字符串長度
NumberRange 驗證輸入的值在數字範圍內
Optional 無輸入值時跳過其餘驗證函數
Required 確保字段中有數據
Regexp 使用正則表達式驗證輸入值
URL 驗證URL
AnyOf 確保輸入值在可選值列表中
NoneOf 確保輸入值不在可選值列表中
相關文章
相關標籤/搜索