我爱Flask之url_for()方法和HTTP请求

黄色标注部分重点注意

1. 用url_for来获取对应函数的URL(路由)

       •一般我们都是通过一个URL(路由)映射到某一个函数。反过来,如果知道了一个函数,也可以通过url_for()函数来获得对应的URL(路由)
       •url_for()函数可以接收一个及多个的参数,第一个参数是函数名,是需要通过url_for()函数来获取路由的函数名,当函数中有参数时,则需要将这些参数依次传入到url_for()函数第一个参数的后面
运行测试:

from flask import Flask, url_for

app = Flask(__name__)


@app.route('/')
def url_request():
    print(url_for('article_list', aid=3))
    return 'Hello World'


@app.route('/article/<aid>')
def article_list(aid):
    return 'article {}'.format(aid)


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

       •运行成功并访问http://127.0.0.1:5000/,返回控制台看到:
在这里插入图片描述
       •我们通过url_for()的方法得到了article_list()函数对应的路由,并在控制台日志中输出。有参数时,调用url_for()方法需要传入参数,有多个参数需要传入多个参数
       •我们得到的article_list()函数的路由是http://127.0.0.1:5000/article/3
通过url_for()函数来获取URL(路由),然后拼接URL的好处有以下两点:
       •当我们修改了URL,但是没有修改该URL对应的函数名时,就可以直接通过url_for()方法来获取函数对应的路由而不需要手动替换所有对应的URL
       •url_for()方法可以转义一些特殊字符unicode字符串
多次运行测试:

from flask import Flask, url_for

app = Flask(__name__)


@app.route('/')
def index():
    print(url_for('article_list', aid=2))
    print(url_for('notice'))
    print(url_for('follow', sid=8, page=9))
    return 'Hello World'


@app.route('/article/<aid>')
def article_list(aid):
    return 'article {}'.format(aid)


@app.route('/notice')
def notice():
    return '但行好事,莫问前程'


@app.route('/follows/<sid>')
def follow(sid):
    return 'Follower {}'.format(sid)


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

       •再次访问http://127.0.0.1:5000/,并返回控制台可以看到:
在这里插入图片描述
       •当url_for()方法里面传入参数多于函数的参数时,会用 & 来连接多于参数
斜杠 / 转码和多于参数测试:

from flask import Flask, url_for

app = Flask(__name__)


@app.route('/')
def index():
    print(url_for('follow', fid=2, page=5, langue='/'))
    return 'Hello Flask'


@app.route('/follows/<fid>')
def follow(fid):
    return 'Follower %s' % fid


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

       •访问http://127.0.0.1:5000/,返回控制台可以看到:
在这里插入图片描述

2. 指定HTTP的请求方法(POST和GET)

       •在默认情况下路由只能使用GET请求HTTP,但是我们可以在@app.route()中传入一个参数methods来指定本方法支持的访问HTTP的方法
       •如果想要使用post请求,可以使用Postman工具来模拟请求,可点击https://www.postman.com/进行下载,也可在评论给博主留言你们的QQ,博主会亲自私信发给你们,安装完成后直接打开运行,就可以模拟各种访问HTTP的请求方法
运行测试:

from flask import Flask

app = Flask(__name__)


@app.route('/ycx') #指定路由
def check():
    return '但行好事,莫问前程'


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

开启服务之后,在Postman中进行访问测试,如下图:
在这里插入图片描述
       •从报错内容分析来看,出错原因是Post方法不被允许
       •在路由中的参数methods中添加POST方法,再次测试:

from flask import Flask

app = Flask(__name__)


@app.route('/ycx', methods=['GET', 'POST']) # methods添加请求方法
def check():
    return '但行好事,莫问前程'


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

再次在Postman中测试POST请求方法:
在这里插入图片描述
       •装饰器让访问check()函数的路由既能支持GET方法又能支持POST方法
       •当给定methods参数后,那么访问路由就只能使用列表中的方法请求,如果列表中没有的方法则不能再用该方法进行请求
       •当没有给定methods参数时,默认只能用GET方法请求HTTP
Postman还可以传入参数,在Flask项目中接收参数
运行测试:

from flask import Flask, request #导入request模块

app = Flask(__name__)


@app.route('/ycx/', methods=['GET', 'POST'])
def check():
    print(request.form.get('name'))# 接收参数
    return '但行好事,莫问前程'


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

在Postman中传入参数:
在这里插入图片描述
返回查看控制台日志,出现以下输出:
在这里插入图片描述
       •就这样的得到了传入的数据
接收传入数据的方法:
       1. 导入request库

from flask import request

       2. 当请求方法不同(GET和POST),接收参数的语句就不同
              • GET请求方式接收参数:

request.args.get('xxx') # 'xxx'为参数名

              • POST请求方式接收参数:

request.form.get('xxx') # 'xxx'为参数名

3. 网页跳转和重定向

       •重定向在页面上的表现形式就是从浏览器一个页面点击某个按钮,然后跳转到另外一个页面(包括:网页重定向域名的重定向路由选择的变化也是对数据报文经由路径的一种重定向)

3.1 重定向的两大类

       永久重定向:
              •永久重定向的HTTPStatus Code(状态码)是301,多用于旧网址被废弃了要跳转到一个新的网址来确保用户的正常访问
              •例如:京东官方网站,当你输入www.jingdong.com的时候,会被重定向到www.jd.com,是因为jingdong.com这个网址已经被废弃了,被改成jd.com,这种情况应当用永久重定向来确保用户的正常浏览与访问
       暂时性重定向:
              •暂时性重定向的HTTPStatus Code(状态码)是302,表示页面的暂时性跳转
              •例如:用户要访问一个需要权限的网址,如果当前用户没有登录,应该重定向到登录页面,这种情况下应当使用暂时性重定向,保证用户在登陆完成后,可以返回原来要访问的页面

3.2 重定向在Flask的应用

       •在Flask中,重定向是通过flask.redirect(url, code=302)这个方法来实现的,url表示需要重定向到的路由,可以结合url_for()方法来一起使用
       •code表示重定向类型的状态码(Status Code),默认是302即为暂时性重定向,可以修改成301来实现永久性重定向

运行测试:

from flask import Flask, request, redirect

app = Flask(__name__)


@app.route('/')
def index():
    return 'Hello Flask'


@app.route('/article/<aid>')
def article_list(aid):
    return 'article {}'.format(aid)


@app.route('/login/')
def login():
    print(request.form.get('name'))
    return 'Hello login'


@app.route('/ycx/')
def profile():
    name = request.args.get('name')
    if name:
        return name
    else:
        return redirect('/login') #当没有name参数是则直接重定向访问/login/路由


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

重定向访问如下:
在这里插入图片描述
访问路由中没有name参数直接重定向访问/login/路由
       •控制台日志显示为:
在这里插入图片描述
此时的请求状态码为302,即为暂时性重定向
       •直接重定向到 /login/ 显得不够灵活多变,因为如果路由改变,就必须重新修改代码来实现重定向,此时就需要用到url_for()方法,传入方法名而不是路由地址,即使地址发生改变,也可以正常重定向,如下测试:
并修改状态码为301,重新测试:

from flask import Flask, url_for, request, redirect

app = Flask(__name__)


@app.route('/')
def index():
    return 'Hello Flask'


@app.route('/article/<aid>')
def article_list(aid):
    return 'article {}'.format(aid)


@app.route('/login/')
def login():
    print(request.form.get('name'))
    return 'Hello login'


@app.route('/ycx/')
def profile():
    name = request.args.get('name')
    if name:
        return name
    else:
        # return redirect('/login')
        return redirect(url_for('login'),code=301) # 使用url_for()方法传入函数名来获取路由,并修改状态码为301


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

页面输出结果与之前相同
       •控制台日志输出如下:
在这里插入图片描述
       •网页源码中状态码也显示为301,如下图:
在这里插入图片描述

3. 函数的返回值 - 响应(Response)

视图函数中一般情况下可以返回以下类型的值:
       •Response对象
       •字符串
              Flask是根据返回的字符串类型重新创建一个werkzeug.wrappers.Response对象,Response将该字符串作为主体,状态码为200,MIME类型为text/html,然后返回该Response对象
       •元组
              传入元组的格式是(response,status,headers)response为一个字符串status值是状态码headers是响应头
       •如果不是以上三种类型,Flask会通过Response.force_type(rv,request.environ)转换为一个请求对象
列表返回测试:

from flask import Flask

app = Flask(__name__)


@app.route('/number')
def number():
    return [9, 8, 7]


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

访问网页http://127.0.0.1:5000/number显示如下:

在这里插入图片描述
字典返回测试:

from flask import Flask

app = Flask(__name__)


@app.route('/')
def about():
    return {
    
    'name': 'ycx','age':18}


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

访问网页http://127.0.0.1:5000/显示如下:
在这里插入图片描述
也可以返回元组,但只返回元组的第一个元素
       •在一般情况下,返回元组的用法是return ‘但行好事,莫问前程’,301,即return ‘字符串’,状态码
Response返回测试:

from flask import Flask,Response

app = Flask(__name__)


@app.route('/')
def about():
    return Response('但行好事,莫问前程',301)


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

访问网页http://127.0.0.1:5000/显示如下:
在这里插入图片描述
       •给Response对象传入字符串参数后,返回内容和字符串是相似的;Response(‘但行好事,莫问前程’)相当于Response(‘但行好事,莫问前程’,status=200,mimetype=‘text/html’)
       •Response的用法是Response(‘字符串’,状态码,mimetype=‘text/htm’),也可以用make_response()方法创建Response对象并返回,这个方法可以设置额外的参数,比如设置cookie、header等信息

有问题可以在评论指正,欢迎讨论,谢谢大家!!

猜你喜欢

转载自blog.csdn.net/qq_45261963/article/details/109129147
今日推荐