需求:當客戶端發送請求並攜帶數據給服務端訪問視圖函數時,如何才能正確的取出數據呢?html
請求攜帶的數據可能出如今HTTP報文中的不一樣位置,須要使用不一樣的方法來獲取參數。程序員
例如,有一個請求訪問的接口地址爲/users/123
,其中123實際上爲具體的請求參數,代表請求123號用戶的信息。此時如何從url中提取出123的數據?正則表達式
Flask不一樣於Django直接在定義路由時編寫正則表達式的方式,而是採用轉換器語法:json
@app.route('/users/<user_id>') def user_info(user_id): print(type(user_id)) return 'hello user {}'.format(user_id)
此處的<>
便是一個轉換器,默認爲字符串類型,即將該位置的數據以字符串格式進行匹配、並以字符串爲數據類型類型、 user_id
爲參數名傳入視圖。flask
DEFAULT_CONVERTERS = { 'default': UnicodeConverter, 'string': UnicodeConverter, 'any': AnyConverter, 'path': PathConverter, 'int': IntegerConverter, 'float': FloatConverter, 'uuid': UUIDConverter, }
將上面的例子以整型匹配數據,能夠以下使用:服務器
@app.route('/users/<int:user_id>') def user_info(user_id): print(type(user_id)) return 'hello user {}'.format(user_id) @app.route('/users/<int(min=1):user_id>') def user_info(user_id): print(type(user_id)) return 'hello user {}'.format(user_id)
自定義轉換器:若是遇到須要匹配提取/sms_codes/18512345678
中的手機號數據,Flask內置的轉換器就沒法知足需求,此時須要自定義轉換器。cookie
自定義轉換器主要作3步session
建立轉換器類,保存匹配時的正則表達式app
from werkzeug.routing import BaseConverter class MobileConverter(BaseConverter): """ 手機號格式 """ regex = r'1[3-9]\d{9}' # 使用正則表達式匹配手機號
regex
名字固定將自定義的轉換器告知Flask應用函數
app = Flask(__name__) # 將自定義轉換器添加到轉換器字典中,並指定轉換器使用時名字爲: mobile app.url_map.converters['mobile'] = MobileConverter
在使用轉換器的地方定義使用
@app.route('/sms_codes/<mobile:mob_num>') def send_sms_code(mob_num): return 'send sms code to {}'.format(mob_num)
若是想要獲取其餘地方傳遞的參數,能夠經過Flask提供的request對象來讀取。
不一樣位置的參數都存放在request的不一樣屬性中
屬性 | 說明 | 類型 |
---|---|---|
data | 記錄請求的數據,並轉換爲字符串 | * |
form | 記錄請求中的表單數據 | MultiDict |
args | 記錄請求中的查詢參數 | MultiDict |
cookies | 記錄請求中的cookie信息 | Dict |
headers | 記錄請求中的報文頭 | EnvironHeaders |
method | 記錄請求使用的HTTP方法 | GET/POST |
url | 記錄請求的URL地址 | string |
files | 記錄請求上傳的文件 | * |
例如 想要獲取請求/articles?channel_id=1
中channel_id
的參數,能夠按以下方式使用:
from flask import request @app.route('/articles') def get_articles(): channel_id = request.args.get('channel_id') return 'you wanna get articles of channel {}'.format(channel_id)
客戶端上傳圖片到服務器,並保存到服務器中
from flask import request @app.route('/upload', methods=['POST']) def upload_file(): f = request.files['pic'] # with open('./demo.png', 'wb') as new_file: # new_file.write(f.read()) f.save('./demo.png') return 'ok'
需求:如何在不一樣的場景裏返回不一樣的響應
使用render_template
方法渲染模板並返回
from flask import render_template @app.route('/') def index(): mstr = 'Hello 黑馬程序員' mint = 10 return render_template('index.html', my_str=mstr, my_int=mint)
from flask import redirect @app.route('/demo2') def demo2(): return redirect('http://www.itheima.com')
from flask import jsonify @app.route('/demo3') def demo3(): json_dict = { "user_id": 10, "user_name": "laowang" } return jsonify(json_dict)
能夠返回一個元組,這樣的元組必須是 (response, status, headers) 的形式,且至少包含一個元素。 status 值會覆蓋狀態代碼, headers 能夠是一個列表或字典,做爲額外的消息標頭值。
@app.route('/demo4') def demo4(): # return '狀態碼爲 666', 666 # return '狀態碼爲 666', 666, [('Itcast', 'Python')] return '狀態碼爲 666', 666, {'Itcast': 'Python'}
@app.route('/demo5') def demo5(): resp = make_response('make response測試') resp.headers[「Itcast」] = 「Python」 resp.status = 「404 not found」 return resp
from flask import Flask, make_response app = Flask(__name__) @app.route('/cookie') def set_cookie(): resp = make_response('set cookie ok') resp.set_cookie('username', 'itcast') return resp
設置有效期
@app.route('/cookie') def set_cookie(): response = make_response('hello world') response.set_cookie('username', 'itheima', max_age=3600) return response
from flask import request @app.route('/get_cookie') def get_cookie(): resp = request.cookies.get('username') return resp
from flask import request @app.route('/delete_cookie') def delete_cookie(): response = make_response('hello world') response.delete_cookie('username') return response
須要先設置SECRET_KEY
class DefaultConfig(object): SECRET_KEY = 'fih9fh9eh9gh2' app.config.from_object(DefaultConfig)
或者直接設置
app.secret_key='xihwidfw9efw'
from flask import session @app.route('/set_session') def set_session(): session['username'] = 'itcast' return 'set session ok'
@app.route('/get_session') def get_session(): username = session.get('username') return 'get session username {}'.format(username)