安裝環境:css
centos 6.3html
python2.6python
使用easy_install安裝方式:flask
[root@localhost ~]# easy_install flaskcentos
簡單的hello瀏覽器
from flask import Flask安全
app = Flask(__name__)服務器
@app.route("/")cookie
def hello():app
return "Hello World!"
if __name__ == "__main__":
app.run()
運行:
[root@localhost flask]# python hello.py
* Running on http://127.0.0.1:5000/
在瀏覽器中打開 http://127.0.0.1:5000/ ,就 能夠看到問候頁面了。
from flask import Flask
導入Flask類
app = Flask(__name__)
實例化對象app,參數爲應用模塊或包的名稱,這裏__name__指的是__main__主程序。這個參數是必需的,這樣 Flask 就能夠知道在哪裏找
到模板和靜態文件等東西。
@app.route("/")
使用route()裝飾器告訴Flask觸發函數的URL。
def hello():
return "Hello World!"
定義的函數,用來生成相關聯的URL,並返回須要在用戶瀏覽器中顯示的信息。
app.run()
運行服務器應用,運行後默認只有本地能夠訪問,如需讓其餘鏈接,能夠指定host,如:app.run(host='0.0.0.0')
默認使用的端口是:5000,可使用自定義的端口:app.run(host="0.0.0.0",port=8000)
調試模式:
打開調試模式後,服務器會在修改應用以後自動重啓,而且當應用出錯時還會提供一個有用的調試器;
打開調試模式有兩種方法:
1.在應用對象上設置標誌
app.debug = True
app.run()
2.做爲參數傳遞給 run 方法:
app.run(debug=True)
路由:
route()裝飾器把一個函數綁定到一個URL,用戶在瀏覽器輸入相關的URl後,會獲得相應的函數返回。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Index Page'
@app.route('/hello')
def hello():
return 'Hello World'
if __name__ == "__main__":
app.debug = True
app.run(host="0.0.0.0",port=8000)
在瀏覽器用直接訪問顯示Index Page,後URL後面加/hello顯示Hello World.
變量規則:
經過把URl一部分標記爲 <variable_name>就能夠在URL中添加變量。標記的部分做爲關鍵字參數傳遞給函數。經過使用
<converter:variable_name>,能夠選擇性的加上一個轉換器,爲變量指定規則。
例:
from flask import Flask
app = Flask(__name__)
@app.route('/user/<username>')
def show_user_profile(username):
return 'User %s' % username
@app.route('/post/<int:postid>')
def show_post(post_id):
return 'Post %d' % post_id
if __name__ == "__main__":
app.run(host='0.0.0.0')
其中int是爲轉換器,接受整數。
URL 構建
url_for()函數用於構建指定的函數URL的。它把函數名稱做爲第一個參數,其他參數對應URL中的變量。未知變量將添加到URL中查詢參數。
from flask import Flask, url_for
app = Flask(__name__)
@app.route('/')
def index():
pass
@app.route('/login')
def login():
pass
@app.route('/user/<username>')
def profile(username):
pass
with app.test_request_context():
print url_for('index')
print url_for('login')
print url_for('login', next='/')
print url_for('profile', username='John Doe')
輸出:
/
/login
/login?next=%2F
/user/John%20Doe
test_request_context()方法的做用是告訴Flask咱們正在處理一個請求,這裏處於python 執行下,並無真正請求。
不把URL寫死在模板而用動態構建的三個理由:
1.反向解析一般比硬編碼URL更直觀。同時,更重要的是你能夠只在一個地方改變URL,而不用處處找。
2.URL建立會爲你處理特殊字符轉義和Unicode數據,不用你操心。
3.若是你的應用是放在URL根路徑以外的地方(如在/myapplication中,不在/中),url_for會爲你妥善處理。
HTTP 方法
默認狀況下一個路由只回應GET請求,可是可能經過methods參數使用不一樣方法。
例:
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
do_the_login()
else:
show_the_login_form()
靜態文件
在開發過程當中, Flask 也能作好這個 工做。只要在你的包或模塊旁邊建立一個名爲 static 的文件夾就好了。靜態文件位於 應用的
/static 中。
使用選定的'static' 端點就能夠生成相應URL:
url_for('static',filename='style.css')
這個靜態文件在文件系統中的位置應該是static/style.css。
渲染模板
使用render_template()方法渲染模板,你只要提供模板名稱和須要做用參數傳遞給模板的變量就好了。
例:
Flask會有templates文件夾內尋找模板。所以,若是你的應用是一個模塊,尋麼模板文件夾應該在模塊旁邊;若是是一個包,那麼就應該在包裏面:
1.application.py
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/hello')
@app.route('hello/<name>')
def hello(name=None):
return render_template('hello.html', name = name)
if __name__ == "__main__:"
app.run(host='0.0.0.0')
2.創建templates
mkdir templates
3.在templates目錄下創建hello.html
<!doctype html>
<html>
<head>
<title>Hello from Flask</title>
</head>
<body>
{% if name %}
<h1>Hello {{name}}! </h1>
{% else %}
<h1>Hello World! </h1>
{% endif %}
</body>
</html>
測試:
自動轉義默認開啓。所以,若是 name包含HTML,那麼會被自動轉義。若是能夠信任某個變量,且知道它是安全的HTML,那麼可使用Markup類把它標記爲安全的。不然請在模板中使用|safe過濾器。
>>> from flask import Markup
>>> Markup('<strong>Hello %s!</strong>') % '<blink>hacker</blink>'
Markup(u'<strong>Hello <blink>hacker</blink>!</strong>')
>>> Markup.escape('<blink>hacker</blink>')
Markup(u'<blink>hacker</blink>')
>>> Markup('<em>Marked up</em> » HTML').striptags()
u'Marked up \xbb HTML'
文件上傳:
確保HTML表單中設置了enctype=」multipart/form-data」屬性。不然瀏覽器不會傳送文件。
已上傳的文件被儲存在內存或文件系統的臨時位置。能夠經過對象files屬性來訪問上傳的文件。每一個上傳的文件都儲存在這個字典屬性中,這個屬性基本和標準的python file對象同樣,另外多出一個用於用上傳的文件保存到服務器的文件系統中。
from flask import request
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['the_file']
f.save('/var/www/uploads/uploaded_file.txt')
cookies
讀取
username = request.cookies.get('username')
設置
resp.set_cookie('username', 'the username')
重定向和錯誤
from flask import abort, redirect, url_for
@app.route('/')
def index():
return redirect(url_for('login'))
@app.route('/login')
def login():
abort(401)
this_is_never_executed()