Flask入門第一天

  1、flask介紹

  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:簡單而可擴展的管理接口的框架

  2、安裝Flask

  1,配置虛擬環境

  在cmd中輸入:mkvirtualenv flask_demo,這樣就爲flask建立了一個名叫flask_demo的虛擬環境。數據庫

  2,在虛擬環境中安裝flask模塊

  在flask_demo的虛擬環境下,輸入:pip install flask==0.12.4json

  3,把pycharm環境成flask_demo環境

  在pycharm中,找到:File--Settings中把環境換成flask_demo,以前咱們將虛擬環境的有說過具體步驟。flask

  3、構建一個簡單的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

  4、路由的設置

  1,基本定義

# 指定訪問路徑爲 demo1
@app.route('/demo1')
def demo1():
    return 'demo1'

  2,路由傳值

咱們把路由的一部分做爲參數傳遞給視圖,叫路由傳值,好比說刪除,修改的視圖,就須要要修改的對象的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

  3,路由限定請求方式

@app.route('/demo2', methods=['GET', 'POST'])   #只容許get、post請求訪問到這個視圖
def demo2():
    # 直接從請求中取到請求方式並返回
    return request.method

  4,轉換器

  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

  5、請求request對象

  1,request對象的屬性

from flask import request

request對象的屬性:
data:記錄請求的數據,並轉換爲字符串
form:記錄請求中的表單數據,數據類型爲MultiDict
args:記錄請求中的查詢參數,數據類型爲MultiDict
cookies:記錄請求中的cookie信息,數據類型爲Dict
headers:記錄請求中的請求頭
method:記錄請求使用的HTTP方法
url:記錄請求的URL地址stringfiles記錄請求上傳的文件

  2,獲取請求體中的查詢字符串

"""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)

  6、響應

flask默認支持2種響應方式:

數據響應: 默認響應html文本,也能夠返回 JSON格式

重定向: redirect,url_for重定向到自身的視圖

響應的時候,flask也支持自定義http響應狀態碼

  1,數據響應

  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,重定向

  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))

  3,自定義狀態碼

@app.route('/demo4')
def demo4():
    return '狀態碼爲 666', 400

  7、cookie與session

  1,cookie

  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,session

  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')
相關文章
相關標籤/搜索