美文网首页
URL与视图函数的映射

URL与视图函数的映射

作者: 茶浅呀 | 来源:发表于2020-05-30 14:32 被阅读0次

    今天跟大家讲的是URL与视图函数的映射

    URL与视图函数的映射

    url与视图函数的映射是通过@app.route()装饰器实现的。

    1、只有一个斜杠代表的是根目录——首页。
    # coding: utf-8
    from flask import Flask
    # __name__是用来确定flask运行的主文件
    app = Flask(__name__)  # type: Flask
    app.debug = True
    # app.config.from_object('configs')
    @app.route('/')
    def hello_world():
    
        return 'Hello World!'
    if __name__ == '__main__':
        app.run()
    

    上面代码@app.route('/')装饰器传参只有一个斜杠/,这时候运行代码就会跳转到根目录——首页。如图:

    2、传参

    URL传参是通过<参数名称>的形式进行传递。另外,URL中有几个参数,在视图函数中也要指定几个参数。参数名称可以自己定义,代码如下:

    # coding: utf-8
    from flask import Flask
    # __name__是用来确定flask运行的主文件
    app = Flask(__name__)  # type: Flask
    app.debug = True
    # app.config.from_object('configs')
    # 根目录
    @app.route('/')
    def hello_world():
    
        return 'Hello World!'
    # 传参
    @app.route('/content/<username>/<password>/')
    def login(username, password):
    
        return u'我的用户名是:%s,密码是:%s' % (username, password)
    if __name__ == '__main__':
        app.run()
    

    执行代码后,在浏览器输入你设置的地址可以看到:

    需要注意的是,上面<>里面写的参数名称必须和你def函数里传参名称相同,比如我写的参数名叫username,那么我代码里login后面的形参名称必须叫username,上面代码我传了两个参数,地址写的时候分别传了warrior和123。

    3、URL的数据类型

    1)如果没有指定,默认是string类型
    2)string:字符串,接收任何没有斜杠/的字符。
    3)int:整型
    4)float:浮点类型
    5)path:和string类似,但是可以接收斜杠/
    6)uuid:只接收uuid字符串
    7)any:可以指定多个路径

    例如,现在我们指定一个参数为int类型:

    # coding: utf-8
    from flask import Flask
    # __name__是用来确定flask运行的主文件
    app = Flask(__name__)  # type: Flask
    app.debug = True
    
    # 根目录
    @app.route('/')
    def hello_world():
    
        return 'Hello World!'
    # @app.route('/content/<username>/<password>/')
    # def login(username, password):
    #     return u'我的用户名是:%s,密码是:%s' % (username,password)
    @app.route('/content/<int:username>/<int:password>/')
    def login(username, password):
    
        return u'我的用户名是:%s,密码是:%s' % (username, password)
    if __name__ == '__main__':
        app.run()
    

    在页面中我传入两个1,可以看到:

    但是当我传入warrior和1以后就找不到页面了,因为warrior不是int类型:

    uuid

    接下来简单说一下uuid,因为uuid在传参的时候更长用,uuid就是唯一的一串字符,永远不会出现重复,比如:

    # coding: utf-8
    from flask import Flask
    import uuid
    app = Flask(__name__)  # type: Flask
    app.debug = True
    
    # 根目录
    @app.route('/')
    def hello_world():
    
        return 'Hello World!'
    
    # @app.route('/content/<username>/<password>/')
    # def login(username, password):
    #     return u'我的用户名是:%s,密码是:%s' % (username, password)
    
    @app.route('/content/<uuid:username>/')
    def login(username):
    
        return u'我的用户名是:%s' % (username)
    print uuid.uuid4()
    if __name__ == '__main__':
        app.run()
    

    上面代码中我们先导入了import uuid模块,然后通过print uuid.uuid4()打印出了一串uuid:

    这时候因为我们指定了username是uuid类型的,所以当我们进入http://127.0.0.1:5000/content/1/的时候就会找不到地址,我们将控制台打印的uuid替换1:http://127.0.0.1:5000/content/7bdcd04c-62fd-48e8-b12b-bbd636cd0315/就可以看到:

    any

    any就是指定传递的任意参数,比如下面代码我们指定传参为username或者blog,那么我们在URL中输入username或者blog都会链接到指定页面,输入any指定参数以外的内容页面则会报错:

    # coding: utf-8
    from flask import Flask
    import flask
    import uuid
    
    app = Flask(__name__)  # type: Flask
    app.debug = True
    
    # 根目录
    @app.route('/')
    def hello_world():
    
        return 'Hello World!'
    
    # @app.route('/content/<username>/<password>/')
    # def login(username, password):
    #     return u'我的用户名是:%s,密码是:%s' % (username, password)
    
    @app.route('/content/<uuid:username>/')def login(username):
    
        return u'我的用户名是:%s' % (username)
     @app.route('/post/<any(username,blog):name>/')
    def post_info(name):
    
        return u'id是:%s' % name
    print uuid.uuid4()if __name__ == '__main__':
        app.run()
    

    参数传递

    最后我们来说一下参数传递。理论上推荐path——接收带斜杠的字符串形式传递参数,因为这样有利于网站的SEO即网站在搜索引擎结果的排名:

    @app.route('/post/<path:username>/')
    def user(username):
    
        return u'用户名字是:%s' % username
    

    另一种传参方式就是大部分网站在用的?path=1&username=warrior这种查询字符串的方式:
    @app.route('/post/')def question():
    
        post_id = flask.request.args.get('post_id')
        return u'post_id是:%s' % post_id
    

    上面flask.request.args.get('post_id')就是获取地址里的传参:

    至于想用哪种方式,就看你是不是在乎自己网站在搜索引擎中的排名啦~

    这一篇内容稍微有点多,大家慢慢消化,最后把代码贴给大家,供大家参考:
    如果对软件测试、接口测试、自动化测试、面试经验交流。感兴趣可以加软件测试交流:1085991341,还会有同行一起技术交流。

    # coding: utf-8
    from flask import Flask
    import flaskimport uuid
    
    # __name__是用来确定flask运行的主文件
    app = Flask(__name__)  # type: Flask
    app.debug = True
    
    # 根目录@app.route('/')
    def hello_world():
    
        return 'Hello World!'
    
    # @app.route('/content/<username>/<password>/')
    # def login(username, password):
    
    #     return u'我的用户名是:%s,密码是:%s' % (username, password)
    # uuid
    @app.route('/content/<uuid:username>/')
    def login(username):
    
        return u'我的用户名是:%s' % (username)
    # any
    @app.route('/post/<any(username,blog):name>/')
    def post_info(name):
    
        return u'id是:%s' % name
    # path@app.route('/post/<path:username>/')
    def user(username):
    
        return u'用户名字是:%s' % username
    # ?id=1&user=warrior形式传递参数
    @app.route('/post/')
    def question():
    
        post_id = flask.request.args.get('post_id')
        return u'post_id是:%s' % post_id
    
    print uuid.uuid4()if __name__ == '__main__':
        app.run()
    

    以上内容希望对你有帮助,有被帮助到的朋友欢迎点赞,评论。

    相关文章

      网友评论

          本文标题:URL与视图函数的映射

          本文链接:https://www.haomeiwen.com/subject/txvfzhtx.html