由于项目需要,需要学习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_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}