码迷,mamicode.com
首页 > 其他好文 > 详细

chapter2 - 程序的基本结构

时间:2021-02-04 11:50:55      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:关系   start   类型   nbsp   pytho   根据   全局变量   参数   返回   

2.1 初始化

所有Flask程序都必须创建一个程序实例,程序实例是Flask类的对象:

from flask import Flask
app = Flask(__name__)

2.2 路由和视图函数

处理URL和函数之间关系的程序称为路由。在Flask中,使用程序实例提供的app.route修饰器,把修饰的函数注册为路由。如:

@app.route(/)
def index():
    return <h1>Hello World!</h1>

如上代码即把网站的根目录(用/表示)和index()函数绑定在一起,即访问网站首页时,会获得函数index()返回的内容。这里的index()被称为视图函数

动态URL

动态URL可以根据URL中参数的不同而返回不同的页面内容。在Flask中可以通过修饰器实现这一功能:

@app.route(/user/<name>)
def user(name):
    return <h1>Hello, %s!</h1> % name

尖括号中的内容就是动态部分。调用视图函数时,Flask会将动态部分作为参数传入函数。 路由中的动态部分默认使用字符串,不过也可以使用类型定义。例如,路由/user/<int:id>只会匹配动态片段id为整数的URL。Flask支持在路由中使用int、float、path类型,path类型也是字符串,但不把斜线视为分隔符,而将其当作动态片段的一部分。

2.3 启动服务器

程序实例用run方法来启动Flask中集成的Web服务器:

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

在run函数中设置debug=True可以启用调试模式,在服务器启动后,会进入轮询,直到程度停止

2.4 一个完整的程序

from flask import Flask
app = Flask(__name__)

@app.route(/)
def index():
    return <h1>Hello World!</h1>

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

将程序保存为hello.py,并使用(venv) $ python hello.py执行程序,可以看到在命令提示符中有类似于以下的提示:

* Running on  (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger pin code: 200-024-153

 此时,打开浏览器并在地址栏中输入即可以看到程序运行结果

动态路由

from flask import Flask
app = Flask(__name__)

@app.route(/)
def index():
    return <h1>Hello World!</h1>

@app.route(/user/<name>)
def user(name):
    return <h1>Hello, %s!</h1> % name

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

此时,在服务器中访问即可以看到一个使用了name动态参数生成的欢迎消息。

2.5 请求-响应循环

2.5.1 程序和请求上下文

将要处理的对象作为参数传入到视图函数中是一个很方便的处理方式,但这样会导致程序中的每个视图函数都需要增加一个参数。

并且,如果视图函数需要处理多个对象时,情况会变得很糟糕。 Flask使用了上下文临时把某些对象变为全局可访问,来避免这一问题的出现。

from flask import request

@app.route(/)
def index():
    user_agent = request.headers.get(Use-Agent)
    return <p>Your browser is %s</p> % user_agent

如上代码中把request当作全局变量使用。运行后可在浏览器中看到当前使用的浏览器信息 Flask中存在着程序上下文请求上下文两种上下文:

变量名上下文说明current_app 程序上下文 当前激活程序的程序实例g 程序上下文处理请求时用作临时存储的对象。每次请求都会重设这个变量request 请求上下文请求对象,封装了客户端发出的HTTP请求中的内容session 请求上下文用户会话,用于存储请求之间需要“记住”的值的词典

Flask在分发请求之前激活程序和请求上下文,请求处理完成后再将其删除。

程序上下文使用示例

>>> from hello import app
>>> from flask import current_app
>>> current_app.name
Traceback (most recent call last):
...
>>> app_ctx = app.app_context()
>>> app_ctx.push()
>>> current_app.name
hello
>>> app_ctx.pop()

在本例中,没激活上下文前调用current_app.name会导致错误,但在推送完上下文后就可以调用了

2.5.2 请求调度

请求调度用于处理URL和函数之间的关系,在这里称为URL映射。

Flask使用app.route修饰器或者非修饰器形式的app.addurlrule()生成映射。 可以在虚拟环境中利用python shell检查hello.py生成的映射:

(venv) $ python
>>> from hello import app
>>>> app.url_map
Map([<Rule / (HEAD, OPTIONS, GET) -> index>,
 <Rule /static/<filename> (HEAD, OPTIONS, GET) -> static>,
 <Rule /user/<name> (HEAD, OPTIONS, GET) -> user>])

/和/user/<name>路由在程序中使用app.route修饰器定义。/static/<filename>路由是Flask添加的特殊路由,用于访问静态文件 URL映射中的HEAD、OPTIONS、GET是请求方法,由路由进行处理。

2.5.3 请求钩子

请求钩子用于在处理请求之后或之后执行,可以避免在每个视图函数中都使用重复的代码。请求钩子用修饰器实现。Flask支持以下4种钩子

钩子名称说明beforefirstrequest注册一个函数,在处理第一个请求之前运行before_request 注册一个函数,在每次请求之前运行after_request注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行teardown_request注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行

2.5.4 响应

响应即视图函数的返回值,通常是一个字符串。如果视图函数返回的响应需要使用不同的状态码,可以将数字代码作为第二个返回值。如下代码返回一个400状态码:

@app.route(/)
def index():
    return <h1>Bad Request</h1>, 400

make_response的使用

Flask视图函数可以返回Response对象。make_response()函数可接受1个、2个或3个参数,并返回一个Response对象:

from flask import make_response

@app.route(/)
def index():
    response = make_response(<h1>This document carries a cookie!</h1>)
    response.set_cookie(answer, 42)
    return response

重定向

重定向是一种特殊的响应,可以使用302状态码表示,重定向指向的地址由Location首部提供。重定向响应可以使用3个值形式的返回值生成,也可以在Response对象中设定。但由于使用频繁,Flask提供了redirect()辅助函数:

from flask import redirect

@app.route(/)
def index():
    return redirect(http://www.example.com)

错误处理

处理错误用abort函数生成。如下例中,如果URL中动态参数id对应的用户不存在,则返回状态码404

from flask import abort

@app.route(/user/<id>)
def get_user(id):
    user = load_user(id)
    if not user:
         abort(404)
    return <h1>Hello, %s</h1> % user.name

要注意的是,abort抛出的异常是把控制权交给Web服务器而不是调用它的函数

2.6 Flask拓展

Flask被设计为可扩展形式,有很多功能需要用户自行选择安装或自行开发,例如数据库和用户认证。

使用Flask-Script支持命令行选项

使用Flask-Script扩展后,可以通过命令行参数的形式将参数传递给Flask的开发Web服务器 可通过以下命令安装该扩展:(venv) $ pip install flask-script

Flask-Script扩展的使用示例

 from flask import Flask
 from flask import make_response
 from flask.ext.script import Manager

 app = Flask(__name__)
 manager = Manager(app)

 @app.route(/)
 def index():
     return <h1>Hello World!</h1>

 @app.route(/user/<name>)
 def user(name):
     return <h1>Hello, %s!</h1> % name

 @app.route(/response)
 def response():
     response = make_response(<h1>This document carries a cookie!</h1>)
     response.set_cookie(answer, 42)
     return response

 if __name__ == __main__:
     manager.run()

此时,执行python hello.py可得到一个使用提示。主要使用方法有两个:runserver和shell,前者用于启动Web服务器,后者用于启动python shell用于维护任务和调试。可分别通过以下命令执行:
python hello.py runserver
python hello.py shell
运行python hello.py runserver --help可获得更多帮助信息

 

 

 

chapter2 - 程序的基本结构

标签:关系   start   类型   nbsp   pytho   根据   全局变量   参数   返回   

原文地址:https://www.cnblogs.com/tracydzf/p/14367467.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!