一、關於request
在Flask的官方文檔中是這樣介紹request的:對於 Web 應用,與客戶端發送給服務器的數據交互至關重要。在 Flask 中由全局的 request 對象來提供這些信息。
從Flask模塊導入request:from flask import request
request的屬性:下面是request可使用的屬性,其中黑體是比較常用的。
屬性名 | 解釋 |
form | 一個從POST和PUT請求解析的 MultiDict(一鍵多值字典)。 |
args |
MultiDict,要操作 URL (如 ?key=value )中提交的參數可以使用 args 屬性: searchword = request.args.get('key', '') |
values | CombinedMultiDict,內容是form 和args 。 可以使用values替代form和args。 |
cookies | 請求的cookies,類型是dict。 |
stream | 在可知的mimetype下,如果進來的表單數據無法解碼,會沒有任何改動的保存到這個 stream 以供使用。很多時候,當請求的數據轉換爲string時,使用data 是最好的方式。這個stream只返回數據一次。 |
headers | 請求頭,字典類型。 |
data | 包含了請求的數據,並轉換爲字符串,除非是一個Flask無法處理的mimetype。 |
files | MultiDict,帶有通過POST或PUT請求上傳的文件。 |
environ | WSGI隱含的環境配置。 |
method | 請求方法,比如POST、GET。 |
path | 獲取請求文件路徑:/myapplication/page.html |
script_root | |
base_url | 獲取域名與請求文件路徑:http://www.baidu.com/myapplication/page.html |
url | 獲取全部url:http://www.baidu.com/myapplication/page.html?id=1&edit=edit |
url_root | 獲取域名:http://www.baidu.com/ |
is_xhr | 如果請求是一個來自JavaScript XMLHttpRequest 的觸發,則返回True ,這個只工作在支持X-Requested-With 頭的庫並且設置了XMLHttpRequest 。 |
blueprint | 藍圖名字。 |
endpoint | endpoint匹配請求,這個與view_args 相結合,可是用於重構相同或修改URL。當匹配的時候發生異常,會返回None。 |
json | 如果mimetype 是application/json ,這個參數將會解析JSON數據,如果不是則返回None。 可以使用這個替代get_json()方法。 |
max_content_length | 只讀,返回MAX_CONTENT_LENGTH 的配置鍵。 |
module | 如果請求是發送到一個實際的模塊,則該參數返回當前模塊的名稱。這是棄用的功能,使用blueprints 替代。 |
routing_exception = None | 如果匹配URL失敗,這個異常將會/已經拋出作爲請求處理的一部分。這通常用於NotFound 異常或類似的情況。 |
url_rule = None | 內部規則匹配請求的URL。這可用於在URL之前/之後檢查方法是否允許(request.url_rule.methods) 等等。 默認情況下,在處理請求函數中寫下 print('request.url_rule.methods', request.url_rule.methods) 會打印: request.url_rule.methods {‘GET’, ‘OPTIONS’, ‘HEAD’} |
view_args = None | 一個匹配請求的view參數的字典,當匹配的時候發生異常,會返回None。 |
其他方法 |
get_json(force=False, silent=False, cache=True) on_json_loading_failed(e) |
二、常用方法的使用
#代碼示例,僅僅是爲了測試request的屬性值
@app.route('/login', methods = ['GET','POST'])
def login():
if request.method == 'POST':
if request.form['username'] == request.form['password']:
return 'TRUE'
else:
#當form中的兩個字段內容不一致時,返回我們所需要的測試信息
return str(request.headers) #需要替換的部分
else:
return render_template('login.html')
1、method:請求的方法
return request.method #POST
2、form:返回form的內容
return json.dumps(request.form) #{"username": "123", "password": "1234"}
3、args和values:args返回請求中的參數,values返回請求中的參數和form
return json.dumps(request.args)
#url:http://192.168.1.183:5000/login?a=1&b=2、返回值:{"a": "1", "b": "2"}
print(request.args['a'])
#輸出:1
return str(request.values)
#CombinedMultiDict([ImmutableMultiDict([('a', '1'), ('b', '2')]), ImmutableMultiDict([('username', '123'), ('password', '1234')])])
4、cookies:cookies信息
return json.dumps(request.cookies) #cookies信息
5、headers:請求headers信息,返回的結果是個list
return str(request.headers) #headers信息
request.headers.get('User-Agent') #獲取User-Agent信息
6、url、path、script_root、base_url、url_root:看結果比較直觀
return 'url: %s , script_root: %s , path: %s , base_url: %s , url_root : %s' % (request.url,request.script_root, request.path,request.base_url,request.url_root)
'''
url: http://192.168.1.183:5000/testrequest?a&b ,
script_root: ,
path: /testrequest ,
base_url: http://192.168.1.183:5000/testrequest ,
url_root : http://192.168.1.183:5000/
'''
7、date、files:date是請求的數據,files隨請求上傳的文件
@app.route('/upload',methods=['GET','POST'])
def upload():
if request.method == 'POST':
f = request.files['file']
filename = secure_filename(f.filename)
#f.save(os.path.join('app/static',filename))
f.save('app/static/'+str(filename))
return 'ok'
else:
return render_template('upload.html')
#html
<!DOCTYPE html>
<html>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" /><br />
<input type="submit" value="Upload" />
</form>
</body>
</html>