flask誕生於2010年,是Armin ronacher用python語言基於Werkzeug工具箱編寫的輕量級web開發框架。flask自己至關於一個內核,其餘全部的功能都須要擴展。其WSGI工具箱採用Werkzeug(路由模塊),模板引擎則使用jinja2,這兩個是flask框架的核心。html
官網:http://flask.pocoo.org/前端
官網文檔:http://docs.jinkan.org/docs/flask/python
經常使用的擴展包:web
- Flask-SQLalchemy:操做數據庫,ORM; - Flask-script:插入腳本; - Flask-migrate:管理遷移數據庫; - Flask-Session:Session存儲方式指定; - Flask-WTF:表單; - Flask-Mail:郵件; - Flask-Bable:提供國際化和本地化支持,翻譯; - Flask-Login:認證用戶狀態; - Flask-OpenID:認證; - Flask-RESTful:開發REST API的工具; - Flask JSON-RPC: 開發rpc遠程服務[過程]調用 - Flask-Bootstrap:集成前端Twitter Bootstrap框架 - Flask-Moment:本地化日期和時間 - Flask-Admin:簡單而可擴展的管理接口的框架
在cmd中輸入:mkvirtualenv flask_demo,這樣就爲flask建立了一個名叫flask_demo的虛擬環境。數據庫
在flask_demo的虛擬環境下,輸入:pip install flask==0.12.4json
在pycharm中,找到:File--Settings中把環境換成flask_demo,以前咱們將虛擬環境的有說過具體步驟。flask
新建一個py文件,如flask01.py瀏覽器
from flask import Flask, request app = Flask(__name__)
Flask的參數: """ import_name Flask程序所在的包(模塊),傳 __name__ 就能夠 其能夠決定 Flask 在訪問靜態文件時查找的路徑 static_path 靜態文件訪問路徑(不推薦使用,使用 static_url_path 代替) static_url_path 靜態文件訪問路徑,能夠不傳,默認爲:/ + static_folder static_folder 靜態文件存儲的文件夾,能夠不傳,默認爲 static template_folder 模板文件存儲的文件夾,能夠不傳,默認爲 templates """ class Config(object): DEBUG = True app.config.from_object( Config )
#路由加視圖,當訪問下面的這個路徑時,就會調用下面的的函數,路由是由裝飾器的方式綁定在視圖上的 @app.route('/') def index(): return 'Hello World'
#這是把項目運行起來 if __name__ == '__main__': app.run() #不指定的話,默認127.0.0.1:5000 # 還能夠指定服務器IP和端口 #app.run(host="0.0.0.0", port=5000, debug = True)
如今把flask01.py 文件運行起來,咱們在瀏覽器的地址欄輸入:127.0.0.1:5000,就會拿到‘hello world’服務器
因而完成了一次請求和響應,這就是一個簡單web應用。cookie
# 指定訪問路徑爲 demo1 @app.route('/demo1') def demo1(): return 'demo1'
咱們把路由的一部分做爲參數傳遞給視圖,叫路由傳值,好比說刪除,修改的視圖,就須要要修改的對象的id,咱們就能夠經過路由傳值的方式解決
# 路由傳遞參數[沒有限定類型] @app.route('/user/<user_id>') def user_info(user_id): return 'hello %s' % user_id # 路由傳遞參數[限定類型],限定後面的參數必須是int類型 @app.route('/user/<int:user_id>') def user_info(user_id): return 'hello %d' % user_id
@app.route('/demo2', methods=['GET', 'POST']) #只容許get、post請求訪問到這個視圖 def demo2(): # 直接從請求中取到請求方式並返回 return request.method
4.1,在路由傳值的時候,能夠限定類型,上面咱們使用了int類型,這個int就是flask自帶的轉換器。
自帶轉換器:
DEFAULT_CONVERTERS = { 'default': UnicodeConverter, 'path': PathConverter, 'string': UnicodeConverter, 'any': AnyConverter, 'int': IntegerConverter, 'float': FloatConverter, 'uuid': UUIDConverter, }
4.2 自定義轉換器
from werkzeug.routing import BaseConverter
# 自定義正則轉換器 class RegexConverter(BaseConverter): def __init__(self, url_map, *args): super(RegexConverter, self).__init__(url_map) # 將接受的第1個參數看成匹配規則進行保存 self.regex = args[0]
# 將自定義轉換器添加到轉換器字典中,並指定轉換器使用時名字爲: re app.url_map.converters['re'] = RegexConverter
@app.route('/user/<re("[0-9]{3}"):user_id>') def user_info(user_id): return "user_id 爲 %s" % user_id
from flask import request request對象的屬性: data:記錄請求的數據,並轉換爲字符串 form:記錄請求中的表單數據,數據類型爲MultiDict args:記錄請求中的查詢參數,數據類型爲MultiDict cookies:記錄請求中的cookie信息,數據類型爲Dict headers:記錄請求中的請求頭 method:記錄請求使用的HTTP方法 url:記錄請求的URL地址stringfiles記錄請求上傳的文件
"""http://127.0.0.1/?username=xiaoming&lve=1&lve=2&lve=3""" @app.route("/") def index(): username = request.args.get("username") # 獲取單個查詢字符串參數 params = request.args.to_dict() # 獲取全部查詢字符串參數, 獲取請求地址中的查詢字符串並轉換爲字典格式 print(params) love = request.args.getlist("lve") # 若是一個參數有多個值的狀況,能夠經過getlist獲取 print(love)
flask默認支持2種響應方式:
數據響應: 默認響應html文本,也能夠返回 JSON格式
重定向: redirect,url_for重定向到自身的視圖
響應的時候,flask也支持自定義http響應狀態碼
1.1 返回HTML文本
@app.route("/") def index(): # [默認支持]響應html文本 return "<img src='http://flask.pocoo.org/static/logo.png'>"
1.2 返回json數據
from flask import Flask, request, jsonify @app.route("/") def index(): # 也能夠響應json格式代碼 data = [ {"id":1,"username":"liulaoshi","age":18}, {"id":2,"username":"liulaoshi","age":17}, {"id":3,"username":"liulaoshi","age":16}, {"id":4,"username":"liulaoshi","age":15}, ] return jsonify(data)
2.1 redirect
# 頁面跳轉響應 @app.route("/user") def user(): # 頁面跳轉 redirect函數就是response對象的頁面跳轉的封裝 # Location: http://www.baidu.com return redirect("http://www.baidu.com")
2.2 url_for
# 內容響應 @app.route("/") def index(): # [默認支持]響應html文本 # return "<img src='http://flask.pocoo.org/static/logo.png'>" # 也能夠響應json格式代碼 data = [ {"id":1,"username":"liulaoshi","age":18}, {"id":2,"username":"liulaoshi","age":17}, {"id":3,"username":"liulaoshi","age":16}, {"id":4,"username":"liulaoshi","age":15}, ] return jsonify(data) #使用url_for能夠實現視圖方法之間的內部跳轉 # url_for("視圖方法名") @app.route("/login") def login(): return redirect( url_for("index") )
2.2 url_for帶參數
# 路由傳遞參數 @app.route('/user/<user_id>') def user_info(user_id): return 'hello %d' % user_id # 重定向 @app.route('/demo4') def demo4(): # 使用 url_for 生成指定視圖函數所對應的 url return redirect(url_for('user_info', user_id=100))
@app.route('/demo4') def demo4(): return '狀態碼爲 666', 400
1.1 設置cookie
from flask imoprt Flask,make_response @app.route('/set_cookie') def set_cookie(): resp = make_response('this is to set cookie') resp.set_cookie('username', 'xiaoming', max_age=3600) return resp
1.2 獲取cookie
from flask import Flask,request @app.route('/get_cookie') def resp_cookie(): resp = request.cookies.get('username') return resp
2.1 設置session
@app.route('/set_session') def set_session(): session['username'] = 'xiaoming' return 'ok!'
2.2 獲取session
@app.route('/get_session') def get_session(): return session.get('username')