Flask之methods、url_for进行反解析、request的使用、上传文件、abort函数与自定义异常处理、元组、使用jsonify返回json数据、设置和读取cookie

Flask利用methods限制访问方式

在flask中,可以使用在路由装饰器中使用methods=【访问方式】,同一视图中可以同时存在多种访问方式

# 通过methods限定访问方式
@app.route("/post_only",methods=["POST","GET"])
def post_only():
    return "post_only"

if __name__ == '__main__':
    print app.url_map
    app.run(debug=True)

同名的URL可以有不同的访问方式

# 同样URL下和django一样,同名url不同访问方式。
@app.route("/hello",methods=["POST"])
def hello():
    return  "hello 1"

@app.route("/hello",methods=["GET "])
def hello2():
    return "hello 2"

同一视图中可以有多种访问方式,使用if进行判断区分

if request.method == "GET":
    pass
elif request.method == "POST":
    pass

使用url_for进行反解析

使用url_for 的函数,通过视图的名字找到视图对应的url路径

# coding:utf-8

from flask import Flask,current_app,redirect,url_for


# 创建FLask的应用对象
# __name__ 表示当前模块的名字
# 模块名,Falsk这个模块所在的位置为总目录,默认这个目录中static为静态目录, 为模版目录。
app = Flask(__name__)

@app.route("/login")
def login():
    # url = "/"
    # 使用url_for 的函数,通过视图的名字找到视图对应的url路径
    url = url_for("index")
    return redirect(url)


if __name__ == '__main__':
    print app.url_map
    app.run(debug=True)

获取请求参数之request的使用

Flask 中表示当前请求的 request 对象,request对象中保存了一次HTTP请求的一切信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D6F1y1tS-1587388816775)(/Users/zhaobei/Library/Application Support/typora-user-images/image-20200420204253279.png)]

request中包含了前端发送过来的请求参数,request.from可以直接提取请求体中的表单格式数据,是一个类似字典的对象。

# coding:utf-8

from flask import Flask,request

app = Flask(__name__)


# 127.0.0.1:5000/index?city=shenzhen&country=china 查询字符串 Querystring
@app.route("/index",methods=["GET","POST"])
def index():
    # request 中包含了前端发送过来的所有请求数据
    # request.from可以直接提取请求体中的表单格式数据,是一个类似字典的对象
    name = request.form.get("name")
    age = request.form.get("age")
    city = request.args.get("city")
    print request.data
    name_li = request.form.getlist("name")
    print name_li[1]
    return "hello name=%s,age=%s,city=%s"%(name,age,city)

if __name__ == '__main__':
     app.run(debug=True)

上传文件

​ 已上传的文件存储在内存或是文件系统中一个临时的位置。你可以通过请求对象的 files 属性访问它们。每个上传的文件都会存储在这个字典里。它表现近乎为一个标准的 Python file 对象,但它还有一个 save() 方法,这个方法允许你把文件保存到服务器的文件系统上。这里是一个用它保存文件的例子:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XNCj2l13-1587388816778)(file:Users/zhaobei/Library/Group%20Containers/UBF8T346G9.Office/TemporaryItems/msohtmlclip/clip_image001.jpg)]

如果你想知道上传前文件在客户端的文件名是什么,你可以访问 filename 属性。但请记住, 永远不要信任这个值,这个值是可以伪造的。如果你要把文件按客户端提供的文件名存储在服务器上,那么请把它传递给 Werkzeug 提供的 secure_filename() 函数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Krjvzvpw-1587388816779)(file:Users/zhaobei/Library/Group%20Containers/UBF8T346G9.Office/TemporaryItems/msohtmlclip/clip_image001.jpg)]

# coding:utf-8

from flask import Flask,request

app = Flask(__name__)


# 127.0.0.1:5000/index?city=shenzhen&country=china 查询字符串 Querystring
@app.route("/upload",methods=["POST"])
def upload():
    """接受前端传送过来的文件"""
    file_obj = request.files.get("pic")
    if file_obj is None:
        return "没有上传图片"

    # 直接使用上传文件对象进行保存
    file_obj.save("demo1.png")
    return "上传成功"

if __name__ == '__main__':
     app.run(debug=True)

abort函数与自定义异常处理–abort函数

abort()函数用于提前退出(Google翻译abort)一个请求,并用指定的错误码返回。

函数原型如下:

flask.abort(status, *args, **kwargs)

第一个status参数可以是一个状态码,比如,404,也可以是一个WSGI应用,必不可少!示例如下:

abort(404) # 404 Not Found

abort(Response(‘Hello World’)) # Response包装的一个WSGI应用

注意,状态码要出现在Flask定义的异常号列表(the list of exceptions)中,否则会引发内部服务器错误,比如,传递2XX、3XX就不可以的。

# coding:utf-8

from flask import Flask,request,abort,Response

app = Flask(__name__)

@app.route("/login",methods=["GET"])
def upload():
    """接受前端传送过来的文件"""
    # name = request.form.get("name")
    # pwd = request.form.get("pwd")
    name = ""
    pwd = ""
    if name != "zhangsan" and pwd != "admin":
        # 使用abort可以立即终止视图函数的执行
        # 并可以返回给前端特定的信息
        # 1、abort 中可传入特定的状态码信息
        abort(404)
        # 2、传入响应体信息
        # resp = Response("login failed")
        # abort(resp)

    return "login success"

# 自定义错误信息处理方法
@app.errorhandler(404)
def handle_404(err):
    """自定义错误处理方法"""
    # 这里返回的是前端看到的错误信息
    return u"出现了404错误,错误信息:%s"%err



if __name__ == '__main__':
     app.run(debug=True)

元组

可以返回一个元组,这样的元组必须是 (response, status, headers) 的形式,且至少包含一个元素。 status 值会覆盖状态代码, headers 可以是一个列表或字典,作为额外的消息标头值。

# coding:utf-8

from flask import Flask,request,abort,Response,make_response

app = Flask(__name__)

@app.route("/index")
def index():
     # 1、使用元祖自定义相应信息
     # 响应体 状态码 响应头可用列表和字典都可以,响应体是按照顺序从前到后的,后面的可以省略
     # return ("index page",400,[("name","zhaobei"),("age","22")])
     # 自定义状态码含义,状态码与描述空格间隔
     # return ("index page", "666 this a 666 status", [("name", "zhaobei"), ("age", "22")])

     # 2、使用make_response 来构造响应信息
     resp = make_response("indes page2")
     resp.status = "999 this a 999 status"  #设置状态码
     resp.headers["name"] = "zhaobei"  # 响应头
     return resp




if __name__ == '__main__':
     app.run(debug=True)

使用jsonify返回json数据

# coding=utf-8
from flask import Flask,jsonify
import json

app = Flask(__name__)



@app.route("/index")
def index():
    # json就是字符串
    data = {
        "name": "python",
        "age": 18
    }
    # json.dumps 将字典转换为json字符串
    # json.loads 将json字符串转换为字典
    # json_str = json.dumps(data)
    # return json_str,200,{"Content-Type": "application/json"}

    # jsonify帮转转换为json数据,并设置响应头Content-Type为application/json
    return jsonify(data)


if __name__ == '__main__':
    app.run(debug=True)

设置和读取cookie

# coding=utf-8
from flask import Flask,make_response,request

app = Flask(__name__)

@app.route("/set_cookie")
def set_cookie():
    """设置cookie"""
    resp = make_response("success")
    resp.set_cookie("name","zhaochaoqun")
    resp.set_cookie("age","18",max_age=3600)
    return resp

@app.route("/get_cookie")
def get_cookie():
    """获取cookie"""
    cookie = request.cookies.get("name")
    return ("cookie is %s")%cookie

@app.route("/delete_cookie")
def delete_cookie():
    """删除cookie"""
    resp = make_response("del success")
    resp.delete_cookie("name")
    return resp

结语

不积跬步无以至千里,不积小流无以成江海。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值