Python Flask Web開發筆記(一)
由於專案需要,需要學習Python Flask Web開發,下面是學習的記錄(參考部落格)
首先在pycharm中安裝flask包,然後新建一個py檔案,檔案中插入以下程式碼,進行測試:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
然後執行程式,會出現
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
在瀏覽器開啟上面網址,會出現“Hello World”字樣,表示flask包呼叫成功。
@app.route('/')
def hello_world():
return 'Hello World!'
當客戶端訪問/
時,將響應hello_world()
函式返回的內容。注意,這裡返回的是HTTP報文,Hello World!
只是HTTP響應報文的實體部分,狀態碼等資訊既可以由Flask自動處理,也可以通過程式設計來制定。
app = Flask(__name__)
這局程式碼為了程式命名__name__在python中預設為字串“__main__”
完整的使用方法如下:path1存放靜態資源,path2存放模板。
下面的app.run程式碼,預設情況下,Flask繫結IP為127.0.0.1
,埠為5000
。我們也可以通過下面的方式自定義:
app = Flask("my-app", static_folder="path1", template_folder="path2")
app.run(host='0.0.0.0', port=80, debug=True)
0.0.0.0
代表電腦所有的IP。80
是HTTP網站服務的預設埠。什麼是預設?比如,我們訪問網站http://www.example.com
,其實是訪問的http://www.example.com:80
,只不過:80
server.py
。
列出所有的URL引數,輸入一下程式碼:
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def hello_world():
return request.args.__str__()
if __name__ == '__main__':
app.run(port=5000, debug=True)
在電腦瀏覽器中執行網址http://127.0.0.1:5000/?user=Flask&time&p=7&p=8
會出現一下結果
瀏覽器傳給我們的Flask服務的資料長什麼樣子呢?可以通過request.full_path
和request.path
來看一下:
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def hello_world():
print(request.path)
print(request.full_path)
return request.args.__str__()
if __name__ == '__main__':
app.run(port=5000, debug=True)
檢視Post中的資料,以使用者註冊為例子,我們需要向伺服器/register
傳送使用者名稱name
和密碼password
。程式碼如下編寫
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'hello world'
@app.route('/register', methods=['POST'])
def register():
print(request.headers)
print(request.stream.read())
return 'welcome'
if __name__ == '__main__':
app.run(port=5000, debug=True)
`@app.route(‘/register’, methods=[‘POST’])是指url
/register只接受POST方法。可以根據需要修改
methods`引數,同時接收“GET”和Post兩種方式。
執行成功以後,我們可以從之前的執行結果看到一下結果:
Host: 127.0.0.1:5000
User-Agent: python-requests/2.25.1
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Length: 24
Content-Type: application/x-www-form-urlencoded
b'name=letian&password=123'
接下來解析POST中的資料,其中 b'name=letian&password=123' 我們從中提取出name和password,可以使用python中的request.form,例項程式碼如下:
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'hello world'
@app.route('/register', methods=['POST'])
def register():
print(request.headers)
# print(request.stream.read()) # 不要用,否則下面的form取不到資料
print(request.form)
print(request.form['name'])
print(request.form.get('name'))
print(request.form.getlist('name'))
print(request.form.get('nickname', default='little apple'))
return 'welcome'
if __name__ == '__main__':
app.run(port=5000, debug=True)
可以在flask檔案中出現一下資料:
ImmutableMultiDict([('name', 'letian'), ('password', '123')])
letian
letian
['letian']
little apple
request.form
會自動解析資料。request.form['name']
和request.form.get('name')
都可以獲取name
對應的值。對於request.form.get()
可以為引數default
指定值以作為預設值。
使用 HTTP POST 方法傳到網站伺服器的資料格式可以有很多種。我們也可以用JSON格式、XML格式。相比XML的重量、規範繁瑣,JSON顯得非常小巧和易用。如果POST的資料是JSON格式,request.json
會自動將json資料轉換成Python型別(字典或者列表)。程式碼如下:
from flask import Flask, request
app = Flask("my-app")
@app.route('/')
def hello_world():
return 'Hello World!'
@app.route('/add', methods=['POST'])
def add():
print(request.headers)
print(type(request.json))
print(request.json)
result = request.json['a'] + request.json['b']
return str(result)
if __name__ == '__main__':
app.run(host='127.0.0.1', port=5000, debug=True)
附python檔案程式碼如下:
import requests
json_data = {'a': 1, 'b': 2}
r = requests.post("http://127.0.0.1:5000/add", json=json_data)
print(r.text)
執行結果如下:
Host: 127.0.0.1:5000
User-Agent: python-requests/2.19.1
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Length: 16
Content-Type: application/json
<class 'dict'>
{'a': 1, 'b': 2}