1. 程式人生 > 其它 >Python Flask Web開發筆記(一)

Python Flask Web開發筆記(一)

技術標籤:javaWeb flaskpythonjava

由於專案需要,需要學習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

可以省略不寫。由於綁定了80埠,需要使用root許可權執行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_pathrequest.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}