# HTTP 基础
server作为客户端,时刻在运行,保存需要的资料和数据。
用户/程序 和server的交互是通过client,client就是通过API与server进行交互。
因此API 是 client 与 server之间交互的工具。
HTTP(hypertext transfer protocol)是 API中常用的协议,用于传递 网站和图片。一般HTTP包含 requests和responses,client发送请求requests,然后server回应responses。
一个request包含:
和requests类似,包含三部分信息:
APIs通常 使用 JSON / XML格式 来 传递数据。 格式类型在 header的 Context-Type中进行定义。
cilent向server传递requests时, 在request的 content-Type header中会表示自己传递信息的类型(JSON,XML等):“application/json”。 Accept header中说明自己期待的内容类型。
server回应时,会说明自己的数据类型,也是在 content-type header中。
client向server请求过程中 会输入 user name 和 password。 该部分信息存储在 header的"Authorization" field中。
curl -X GET -d date_time="2021-02-19T18:23:00" https://api.data.gov.sg/v1/environment/psi
在编写自己的API时,对于POST指令,我们需要指定上传的文件; 对于GET指令,我们需要指定下载的文件。
pip install flask
我们需要实例化形成flask对象, 然后将在flask对象中 将函数与网址进行捆绑(这种函数被称为 视图函数)。捆绑是为了知道 我们在使用网址与server(python运行后作为server)进行交互时 每一个网址会返回什么,或者调用什么。最后,就是运行flask应用。
from flask import Flask
app = Flask(__name__) # 实例化
@app.route("/") # 实现 URL和函数的捆绑
def hello_world():
return "hello world"
if __name__=="__main__":
app.run() # 如果在python中运行 main.py函数,则需要此行;
此时生成的网址默认为 http://127.0.0.1:5000. http 表示协议。 127.0.0.1 表示IP地址(只能用于本电脑内的访问)。 5000表示端口号
return返回的 可以是字符串,也可以是 字典, 可以是 html的文本段落。
我们在正常模式下 如果编辑python文本,那么需要暂停和重新启动 脚本。
但是如果在debug模式下,只需要保存脚本,刷新网页,就会更新结果。
app.debug = True
app.run(debug=True)
我们在输入网址时,我们可以使用http中的部分信息来作为变量。
@app.route("/" ) # 我们在输入网址时 **可以将替代为任意 不包含"/"的字符串**。
# 不能包含"/",因为html会将其识别为子路径,会报错
def hello_world(name):
return "hello "+name
@app.route("/" )
def show_page(id):
return "page {}".format(id)
当我们需要传入 包含"/"的字符串作为name等等,我们需要调用 markupsafe中的 escape
我们想要重复使用之前定义的函数时,我们可以使用flask.url_fo 和 flask.redirect来 重定位网站。
使用url_for可以将新的函数对应的URL进行返回
而redirect会条转到 新的网址。
from flask import Flask, url_for, redirect
app = Flask(__name__)
@app.route("/user/" )
def hello_world(name):
return "hello %s"%name
@app.route("//" )
def show_page(id):
url = url_for("hello_world",name=str(id))
print(url)
return redirect(url)
if __name__=="__main__":
app.run(debug=True)
当我们访问 "http://127.0.0.1:5000/user/100"时, print会输出 “/user/100” 表示网站, 同时网站显示:“hello 100”。
我们在返回GET请求时,我们可以直接返回一个写好的html文件。 可以使用 render_template 来进行渲染。
我们需要先 1.创建好html文件,并放置在 templates目录下 2.使用render_template调用html文件
# hello_world.html
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>hello worldtitle>
head>
<body>
<h1> Hello World! h1>>
body>
html>
from flask import Flask, render_template
app = Flask(__name__)
@app.route("/")
def hello_world():
return render_template("hello_world.html")
if __name__=="__main__":
app.run(debug=True)
flask的route会默认 处理 “GET” method,而不是其他的请求,因此我们想要处理其他的HTTP请求,我们需要声明,然后再定义。
POST可以从表单里进行操作:request.form[“username”] , request.form[“password”] 等 request.form中会存储变量。
GET 可以这样获取数据: request.args.get()
from flask import Flask, render_template, request, redirect, url_for
app = Flask(__name__)
@app.route("/login",methods=["POST","GET"]) # 声明 双方法
def login():
if request.method == "POST": # 判断使用的方法
print("POST")
print(request.form["name"]) # 获取POST返回的变量,这是 表单里有的信息
return {"status":True} # 返回信息
elif request.method == "GET":
print(request.args) # 获取 GET请求中的信息
return render_template("login.html") # 将表单 传给 用户
if __name__=="__main__":
app.run(debug=True)
DOCTYPE html>
<html>
<head>
<title> login page title> # 标题
head>
<body>
<form action="/login" method="post" > # 创建的表单
<input type="text" placeholder="input your username" name="name" > # text
<input type="password" placeholder="input your password" name="password" > # password
<input type="submit" placeholder="submit"> # submit
form>
body>
html>
http://127.0.0.1:5000/login?key=100
print(request.args)会返回: ImmutableMultiDict([(‘key’, ‘100’)])
http://127.0.0.1:5000/login
print(request.args)会返回: ImmutableMultiDict([])
login.html的 method标识的是 post, 因此 点击submit之后 会触发 POST 请求,然后数据中会有 name, password信息,存储在 request.form中。
如果我们login.html中 method标识的是 get,点击submit之后就会触发 GET请求, 然后数据中的 name,password信息 会存储在 request.args中, 而且返回的http会是: http://127.0.0.1:5000/login?name=XXX&password=XXX。