Flask 学习(二)路由

Flask  路由

  

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

 

  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()

    剖析上述代码:

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

    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.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() 将会适当地替你处理好。

 

 

   

posted @ 2015-07-03 13:54  feesland  阅读(8108)  评论(0编辑  收藏  举报