Flask 学习(二)路由

Flask  路由

  

  在说明什么是 Flask 路由以前,详细阐述下 Flask “Hello World” 这一 最小应用的代码。chrome

 

  Flask “Hello World”

 1 from flask import Flask
 2 
 3 app  =  Flask(__name__)
 4 
 5 @app.route('/')
 6 def hello():
 7     return 'Hello World'
 8 
 9 if __name__ = '__main__':
10     app.run()

    剖析上述代码:flask

    1. 首先,咱们导入了类 Flask 。这个类的实例化将会是咱们的 WSGI 应用。第一个参数是应用模块的名称。 若是你使用的是单一的模块(就如本例),第一个参数应该使用 __name__。由于取决于若是它以单独应用启动或做为模块导入, 名称将会不一样 ( '__main__' 对应于实际导入的名称)。api

    2. 接着,咱们建立一个该类的实例。咱们传递给它模块或包的名称。这样 Flask 才会知道去哪里寻找模板、静态文件等等。
    3. 以后,咱们使用装饰器 route() 告诉 Flask 哪一个 URL 才能触发咱们的函数。这也就是路由,博文以后会详细学习。
    4. 以后 ,定义一个函数,该函数名也是用来给特定函数生成 URLs,而且返回咱们想要显示在用户浏览器上的信息。
    5. 最后,咱们用函数 run() 启动本地服务器来运行咱们的应用。if __name__ == '__main__': 确保服务器只会在该脚本被 Python 解释器直接执行的时候才会运行,而不是做为模块导入的时候。浏览器

    服务器外部可见:安全

      目前服务器 仅可本机 localhost 访问,这是由于默认状况下,调试模式,应用中的一个用户能够执行你计算机上的任意 Python 代码。服务器

      若是你关闭 debug 或者信任你所在网络上的用户,你可让你的服务器对外可用,只要简单地改变方法 run() 的调用像以下这样:网络

       app.run(host='0.0.0.0')  这让你的操做系统去监听全部公开的 IP。app

  

   调试模式函数

    有两种方式开启调式模式:加入语句,应用对象上设置标志位:   app.debug = True  工具

                或者做为 run 的一个参数传入:   app.run(debug=True)   做为 run 的一个参数传入

    调试模式有安全隐患,决不可在生产环境使用,参考以下:

Attention

Even though the interactive debugger does not work in forking environments (which makes it nearly impossible to use on production servers), it still allows the execution of arbitrary code. This makes it a major security risk and therefore it must never be used on production machines.

      打开调试模式下,若网页出错,示例显示如:

 

  Flask 路由

      所谓 路由,即 URL 绑定; Flask 使用 route() 装饰器把一个函数绑于一个URL上, 以下:

 1 from flask import Flask
 2 app  =  Flask(__name__)
 3 
 4 @app.route('/')
 5 def indexPage():
 6     return 'Index Page'
 7     
 8 @app.route('/flask')
 9 def flaskPage():
10     return 'Flask Page'
11 
12 if __name__ == '__main__':
13     app.run()

      如上示例,把 "/" url 绑了indexPage() 函数,把"/flask" url 绑了flaskPage() 函数。

  HTTP请求模拟工具:这边须要使用到HTTP请求工具来查看,chrome可用插件postman;firefox可用HttpRequest。具体使用这边就不介绍了,很简单。

      运行后,请求url   以及 

    

      以上仅是最简单的url构造,你能够动态地构造 URL 的特定部分,也能够在一个函数上附加多个规则。以后会具体介绍。

   变量规则

      给 URL 增长变量的部分,把一些特定的字段标记成 <variable_name>。这些特定的字段将做为参数传入到你的函数中。

      固然也能够指定一个可选的转换器经过规则 <converter:variable_name>。

      先看如下示例(以后示例均省略上下文代码):

@app.route('/user/<username>')
def show_user_profiile(username):
    # show the user profile for that user
    return 'User: {0}'.format(username)

      即简单的URL增长变量,运行后请求的URL需带参数 

 

      存在以下转换器: ,示例代码以下:

@app.route('/userid/<int:user_id>')
def show_userId(user_id):
    # show the user_id, the id  is an integer
    return 'User ID: {0}'.format(user_id)

      URL 须在 "/userid/" 后传递一个整数,运行后如

    HTTP 方法

      默认状况,建立的URL路由是Get方法,可在经过给 route() 装饰器提供 methods 参数来改变 HTTP 方法,有关HTTP协议相关,请Google相关文档。

@app.route("/postUser", methods=["POST"])
def hello_user():
    return "Post User"

      上述示例即为一 Post 方法的路由,运行后直接访问会报405,由于该请求方式 应为 Post,这边使用 FireFox 插件 HttpRequester 来模拟

      

      更改成 Post 方式,

      最经常使用的方式即 Post 和 Get,其余的还有 Delete、Put 等,需用时请阅相关的文档。

   

  Request 参数

    需要引入request   from flask import Flask, request  ,来进行request参数的传值,具体示例以下:

@app.route("/query_user")
def query_user():
    userId = request.args.get("id")
    return "query user: {0}".format(userId)

         有没有很熟悉? 再看下多参数的,以下例:

@app.route("/query_page")
def query_page():
    pageid    = request.args.get("pageid")
    num       = request.args.get("num")
    return "query page: {0} and {1}".format(pageid,num)

         (该部分仅简单介绍,后续会具体学习)

 

  URL 构建

    根据函数名反向生成url。可使用函数 url_for() 来针对一个特定的函数构建一个 URL。它可以接受函数名做为第一参数,以及一些关键字参数, 每个关键字参数对应于 URL 规则的变量部分。未知变量部分被插入到 URL 中做为查询参数。

    需要引入 url_for, from flask import Flask, request, url_for   路由的构建为以前的示例  (这里使用了 test_request_context() 方法,以后章节会给出解释。这边只要了解这个方法是告诉 Flask 表现得像是在处理一个请求便可。)

@app.route('/')
def indexPage():
    return 'Index Page'
    
@app.route("/query_user")
def query_user():
    id = request.args.get("id")
    return "query user: {0}".format(id)
    
with app.test_request_context():
    print url_for('indexPage')
    print url_for('query_user',id=100)

        (该部分仅简单介绍,后续会具体学习)


    URL的构建在实际项目中比较经常使用,为何你愿意构建 URLs 而不是在模版中硬编码?这里有三个好的理由:

      · 反向构建一般比硬编码更具有描述性。更重要的是,它容许你一次性修改 URL, 而不是处处找 URL 修改。      · 构建 URL 可以显式地处理特殊字符和 Unicode 转义,所以你没必要去处理这些。      · 若是你的应用不在 URL 根目录下(好比,在 /myapplication 而不在 /), url_for() 将会适当地替你处理好。

相关文章
相关标签/搜索