您當前位置>首頁 » 新聞資(zī)訊 » 網站(zhàn)建設 >
python3+flask 開發web(一)
發表時間:2018-10-25
發布人:葵宇科技
浏覽次數:47
1、環境準備
1)安裝Python:https://www.python.org/
2)安裝python ide,pycharm:https://www.jetbrains.com/pycharm/
3)安裝flask:安裝好了python,電腦就自動(dòng)安裝了pip,在cmd中(zhōng)執行命令:pip install flask
2、寫代碼:
1)helloword:
from flask import Flask
app = Flask(__name__) #創建一個(gè)wsgi應用
@app.route('/') #添加路(lù)由:根
def hello_world():
return 'Hello World!' #輸出一個(gè)字符串
if __name__ == '__main__':
app.run(debug=True) #啟動(dòng)app的調試模式
?
執行後:
在浏覽器(qì)的地址欄打開:http://127.0.0.1:50000/這個(gè)url,顯示如(rú)下(xià):
本例中(zhōng)app是Flask類的一個(gè)實例,在實例化過程中(zhōng)傳遞了一個(gè)參數name,Flask通(tōng)過這個(gè)參數識别app是模塊級别還是包級别的。實際上app符合相關(guān)接口,它是一個(gè)WSGI應用。
有了app對象以後,它就成為了一個(gè)中(zhōng)心節點,把所有的URL規則、視圖函數、模闆配置等連接起來,最終形成一個(gè)Web應用。
使用@app.route修飾函數創建一個(gè)URL規則,直接在被修飾的函數中(zhōng)寫出處理該URL要做的事情。使用過PHP、ASP的童鞋可(kě)能剛開始不習慣這種URL命名規則,因為最早使用腳本開發Web應用的時候,一個(gè)文(wén)件就會對應一個(gè)URL。
2)字符串
?
from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello_word():
return '<h1>Hello Word!</h1>'
if __name__=='__main__':
app.run(debug=True)
?
執行結果:
3)json
?
?
?
from flask import Flask
import json
app=Flask(__name__)
@app.route('/json')
def do_json():
hello = {"name":"stranger", "say":"hello"}
return json.dumps(hello)
if __name__=='__main__':
app.run(debug=True)
?
?
?
執行結果;
4)http狀态碼:
?
?
?
?
from flask import Flask
import json
app=Flask(__name__)
@app.route('/status_500')
def status_500():
return "hello", 500
if __name__=='__main__':
app.run(debug=True)
?
?
?
?
執行結果:
5)http頭:
from flask import Flask
from flask import make_response
app=Flask(__name__)
@app.route('/set_header')
def set_header():
resp=make_response('<h1>This document has a modified header!</h1>')
resp.headers['X-Something']='A value'
resp.headers['Server']='My special http server'
return resp
if __name__=='__main__':
app.run(debug=True)
?
?
?
?
?
執行結果:
6)cookie:
什麼是cookie:
什麼是cookie?如(rú)果單單從數據結構的角度來說,它可(kě)以被理解成用來保存數據的一個(gè)dictionary,由一組組鍵值對組成.如(rú)果從作用上來說,我們知道Http協議是一種無狀态的協議.什麼叫無狀态呢(ne),就是本次的客戶端請求不會保留上一次客戶端請求的狀态,簡單點說就是這樣會要求我們每次在浏覽器(qì)中(zhōng)點開一個(gè)網站(zhàn)的鍊接都會輸一次賬戶和(hé)密碼.cookie就是用來解決這個(gè)問(wèn)題的.
為了解決上述問(wèn)題,我們第一次登錄web服務器(qì),服務端就會在它的響應中(zhōng)的Set-Cookie字段中(zhōng)發送一些鍵值對,這就包括一個(gè)Session ID以及其他一些信息(也包括我們自定義的cookie中(zhōng)的鍵值對),并告訴客戶端在本地緩存這個(gè)cookie.然後客戶端以後進行鍊接時每次都會發送這個(gè)Session ID,服務器(qì)一看是哪個(gè)Session ID就知道是哪個(gè)客戶端發起的鍊接了,就不會要求我們再次輸賬戶和(hé)密碼驗證了.
我們在flask中(zhōng)自定義cookie,實際上就是在響應Response的Set-Cookie字段中(zhōng)增加我們自定義的鍵值對.而獲取cookie,就是通(tōng)過請求Request中(zhōng)通(tōng)過鍵獲取其對應的值.
(1)設置cookie和(hé)獲取cookie
from flask import Flask
from flask import make_response
import datetime
from flask import request
app=Flask(__name__)
@app.route('/set_cookie') #設置cookie
def set_cookie():
response=make_response('<h1>This document carries a cookie!</h1>')
outdate=datetime.datetime.today()+datetime.timedelta(days=30) #cookie的有效時長30天
response.set_cookie('username','evancss',expires=outdate)
return response
@app.route('/get_cookie') #獲取cookie
def get_cookie():
name=request.cookies.get('username')
return name
if __name__=='__main__':
app.run(debug=True)
執行結果:
set_cookie
get_cookie
注意cookie的時效性:我們在浏覽器(qì)上設置cookie的有效時長優先級要高于我們在代碼中(zhōng)設置的
(2)删除cookie常用的方法:
1可(kě)以通(tōng)過在浏覽器(qì)中(zhōng)設置來清除cookie.
2使用Response的set_cookie進行清除
@app.route('/del_cookie')
def del_cookie():
response=make_response('delete cookie')
response.set_cookie('username','',expires=0)
return response
3使用Response的 delete_cookie方法.
def del_cookie2():
response=make_response('delete cookie2')
response.delete_cookie('username')
return response
7)重定向:
?
?
?
from flask import Flask
from flask import redirect
app=Flask(__name__)
@app.route('/redir')
def redir():
return redirect('https://www.baidu.com')
if __name__=='__main__':
app.run(debug=True)
?
?
?
?
執行結果:
用fiddler抓包看看:
8)abort:
?
?
?
from flask import Flask
from flask import abort
app=Flask(__name__)
@app.route('/user/<id>')
def get_user(id):
if int(id)>10:
abort(404)
return '<h1>Hello,%s</h1>'%id
if __name__=='__main__':
app.run(debug=True)
?
?
?
?
執行結果:
id=22
id=2
遇到的問(wèn)題:新建項目的選擇解釋器(qì)和(hé)location的時候注意一下(xià)
參考博文(wén):https://blog.csdn.net/langkew/article/details/51594880