Flask 入门

# HTTP 基础

Server-client

server作为客户端,时刻在运行,保存需要的资料和数据。
用户/程序 和server的交互是通过client,client就是通过API与server进行交互。
因此API 是 client 与 server之间交互的工具

HTTP(hypertext transfer protocol)是 API中常用的协议,用于传递 网站和图片。一般HTTP包含 requests和responses,client发送请求requests,然后server回应responses。

HTTP requests

一个request包含:

  • URL(uniform resource locator):唯一性的地址。 一个URL对应一个object(资源)。每一个网页就是一个URL。URL并不是只能代表网页,也可以代表文档,图像等等。
    比如: https://developer.mozilla.org/zh-CN/docs/Learn/Common_questions/What_is_a_URL
    http;https 表示 URL使用的协议。 developer.mozilla.org表示域名/IP,对应一个server。 zh-CN/docs/Learn/Common_questions/What_is_a_URL 表示server中资源的位置。
  • method: 针对URL资源的方法
    四种常用的method:
    GET: 向server检索(获取)资源(retrieve) ;
    POST: 要求server创造资源
    PUT: 要求server 编辑/更新 已有的资源
    DELETE: 要求server删除资源
  • List of headers:为request提供了元信息,方便server进行应答。 当我们使用手机向网址发送 GET请求时,list of headers 包含了 "user-agent"header的信息,server会知道 client是手机,从而传递给手机 一个 最优的资源版本。
  • body: 信息主体,包含了数据。。

HTTP responses

和requests类似,包含三部分信息:

  • status code: 三种数字表示不同的特定含义: 404:资源没有找到 ; 200:成功找到 ; 201:server 成功创建了资源。 所有的response code
  • header: 表示 资源的类型等
  • body: 信息主体

Data formats

APIs通常 使用 JSON / XML格式 来 传递数据。 格式类型在 header的 Context-Type中进行定义。

cilent向server传递requests时, 在request的 content-Type header中会表示自己传递信息的类型(JSON,XML等):“application/json”。 Accept header中说明自己期待的内容类型。

server回应时,会说明自己的数据类型,也是在 content-type header中。

Authenticating with APIs

client向server请求过程中 会输入 user name 和 password。 该部分信息存储在 header的"Authorization" field中。

python中创建 HTTP requests

curl终端请求

curl -X GET -d date_time="2021-02-19T18:23:00" https://api.data.gov.sg/v1/environment/psi

requests请求

在编写自己的API时,对于POST指令,我们需要指定上传的文件; 对于GET指令,我们需要指定下载的文件。

使用Flask创建API

0 安装flask

pip install flask

1.使用flask来调用python模块

我们需要实例化形成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的文本段落。

2. 使用debug模式

我们在正常模式下 如果编辑python文本,那么需要暂停和重新启动 脚本。
但是如果在debug模式下,只需要保存脚本,刷新网页,就会更新结果。

app.debug = True

app.run(debug=True)

3. flask的函数中变量规则

我们在输入网址时,我们可以使用http中的部分信息来作为变量。

@app.route("/<name>")   # 我们在输入网址时  **可以将<name>替代为任意 不包含"/"的字符串**。
													  # 不能包含"/",因为html会将其识别为子路径,会报错
def hello_world(name):
    return "hello "+name

@app.route("/<int:id>")
def show_page(id):
    return "page {}".format(id)

在这里插入图片描述

当我们需要传入 包含"/"的字符串作为name等等,我们需要调用 markupsafe中的 escape

URL动态构建

我们想要重复使用之前定义的函数时,我们可以使用flask.url_fo 和 flask.redirect来 重定位网站。
使用url_for可以将新的函数对应的URL进行返回
而redirect会条转到 新的网址。

from flask import Flask, url_for, redirect


app = Flask(__name__)

@app.route("/user/<name>")
def hello_world(name):
    return "hello %s"%name

@app.route("/<int:id>/")
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”。

使用templates模板

我们在返回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 world</title>
</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)

HTTP方法处理

flask的route会默认 处理 “GET” method,而不是其他的请求,因此我们想要处理其他的HTTP请求,我们需要声明,然后再定义

POST可以从表单里进行操作:request.form[“username”] , request.form[“password”] 等 request.form中会存储变量。

GET 可以这样获取数据: request.args.get()

创建具有 GET,POST双方法

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>

GET请求中的信息

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([])

POST请求中的信息

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。

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值