Python 后端 学习笔记 编程 ·

「Flask笔记」 URL知识点总结

flask -- 第一个flask程序


本来打算新开一篇,但是太短了,就整合到这里了

第一个flask程序

from flask import Flask
import config

app = Flask(__name__)
app.config.from_object(config)

@app.route('/')       #定义一个路由
def hello_world():    #定义一个视图函数
    return 'Hello World!'


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

其中config文件时从配置文件中开启debug
也可以在app.run(debug=True)这样开启debug
因为后期链接数据库的配置卸载config中,所以这里使用配置文件开启debug
这里有个坑,就是专业版的pycharm,创建一个flask项目的话debug要在Configurations下勾选FLASK_DEBUG不然开启不了
注意 在配置文件里DEBUG要大写

flask -- URL


唯一URL

from flask import Flask
import config

app = Flask(__name__)
app.config.from_object(config)

@app.route('/hello')
def hello_world():
    return 'Hello World!'

#app.route('/hi/')
def hi_world():
    return 'hi World!'

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

url_for方法

用来反转URL,url_for这个方法的第一个参数是视图函数的名称,后面的是传递的参数,如果在视图函数中这个参数定义了,那么就会当成path传给这个url,如果没有定义,那么就会当成get请求,传入url中。
注意 url_for 会自动处理特殊字符,例如/

当你访问127.0.0.1/hello/的时候会Not Found但是访问127.0.0.1/hi/不会,因为127.0.0.1/hi/就相当于在访问的127.0.0.1/hi做了一个重定向,跳转到127.0.0.1/hi/

URL传递参数

传递参数

传递参数的语法是://。然后再试图函数中,也要定义同名的参数。

get请求传递参数

@app.route('/get/')
def arg_get():
    wd = request.args.get('wd') #get请求参数
    return 'get请求的参数是%s' % wd

参数的数据类型

  1. 如果没有指定,那么默认就是string
  2. 指定int,float 就只能传递相应的数据类型
  3. path类型,与string类型相似,但是可以传递路径,即可以出现/
  4. uuid类型,只接受uuid字符串,唯一的
  5. any类型,可以指定多种路径,这个通过一个例子来说明
@app.route('/<any(blog,user):url_path>/<id>')
def detaol(url_path,id):
    if url_path=='blog':
        return '博客详情 %s' % id
    else:
        return '用户详情 %s' % id

意思就是,你可以选择传入的时blog还是user

自定义URL转换器

自定义个url类型转换器
首先导入from werkzeug.routing import BaseConverter模块
ctrl+b进入源码,可以看到这里定义的BaseConverter类,下面的PathConverter,NumberConverter等,就是之前的参数数据类型都是继承了这个类,然后通过一些方法来定义的转换器,定义完成后加入到DEFAULT_CONVERTERS对应关系中。通过app.url_map.converters['转换器名'] = 定义的转换规则来加入到对应关系中
例1,定义一个简单的手机号码转换器

from flask import Flask
from werkzeug.routing import BaseConverter
import config

app = Flask(__name__)
app.config.from_object(config)

# 限定手机号码的格式
class TelConverter(BaseConverter):
    regex = r'1[85734]\d{9}'

#添加到转换器中
app.url_map.converters['tel'] = TelConverter

#使用定义的转换器
@app.route('/tel/<tel:my_tel>/')
def tel(my_tel):
    return 'your tel is %s' % my_tel

例2,定义一个按照规则分离出两个参数的转换器
介绍两种方法
to_python方法:将传入的value返回到视图函数中做参数
to_url方法:将传入的value调用url_for生成符合要求的url形式

然后定义一个转换器

class ListConverter(BaseConverter):
    def to_python(self, value):
        return value.split('+')
    def to_url(self, value):
        return '+'.join(value)
app.url_map.converters['list'] = ListConverter

@app.route('/')
def hello_world():
    url = url_for('postsa',broad=['a','b'])
    return url

@app.route('/posts/<list:broads>/')
def postsa(broads):
    return "your posts is %s"%broads

重定向

重定向分为永久性重定向和暂时性重定向,在页面上体现的操作就是浏览器会重一个页面自动跳转另外一个页面,比如用户访问了一个需要权限的页面,但是该用户当前并没有登录,因此我们给它重定向到登录页面

永久性重定向:_http的状态码是301,多用于旧网址就废弃了要转到一个新的网址确保用户的访问www.jingdong.com ---> www.jd.com

暂时性重定向:http的状态码是302,表示页面的暂时性跳转。比如访问一个需要权限的网址,如果用户没有登录,应该重定向到登录页面,这种情况下,应该用暂时性重定向

在flask中,重定向是通过flask.redirect(location,code=302)这个函数来实现,location表示需要重定向的url,应该配合之前将的url_for()函数来使用,code表示采用那个重定向,默认是302即暂时性重定向,可以修改成301来实现永久性重定向

重定向方法

可以使用 redirect()方法配合url_for()反转url来实现跳转

from flask import Flask,redirect,url_for
from datetime import datetime
app = Flask(__name__)

@app.route('/')
def index():
    return 'hello world'

@app.route('/login/<username>')
def login(username):
    if username=='admin':
        return "hello %s" % username
    else:
        return redirect(url_for("index")) #重定向到index

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

参与评论