chapter2 - 程序的基本结构

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> user(name):
    <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 一个完整的程序

__name__)

@app.route('

:
    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

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

动态路由



@app.route(/user/<name>' % name

:
    app.run(debug=True)

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

2.5 请求-响应循环

2.5.1 程序和请求上下文

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

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

 request

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

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

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

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

程序上下文使用示例

>>> from hello  app
>>>  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
>>>  app
>>>> app.url_map
Map([<Rule ' (HEAD,OPTIONS,GET) -> index>,<Rule /static/<filename>

/和/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(<h1>Bad Request</h1>',400

make_response的使用

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

 make_response

@app.route( index():
    response = make_response(<h1>This document carries a cookie!</h1>)
    response.set_cookie(answer42return response

重定向

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

 redirect

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

错误处理

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

 abort

@app.route(/user/<id> get_user(id):
    user = load_user(id)
    if not user:
         abort(404' % user.name

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

2.6 Flask拓展

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

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

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

Flask-Script扩展的使用示例

  Flask
  make_response
 from flask.ext.script  Manager

 app = Flask()
 manager = Manager(app)

 @app.route()
  index():
     

 @app.route( user(name):
      name

 @app.route(/response response():
     response = make_response()
     response.set_cookie()
     return response

 :
     manager.run()

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

 

 

 

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Jinja2:是Python的Web项目中被广泛应用的模板引擎,是由Python实现的模板语言,Jinja2 的作者也是 Flask 的作者。他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能,其是Flask内置的模板语言。
Fullcalendar日历使用,包括视图选择、事件插入、编辑事件、事件状态更改、事件添加和删除、事件拖动调整,自定义头部,加入el-popover显示图片、图片预览、添加附件链接等,支持手机显示。
监听QQ消息并不需要我们写代码,因为市面上已经有很多开源QQ机器人框架,在这里我们使用go-cqhttp官方文档:go-cqhttp如果您感兴趣的话,可以阅读一下官方文档,如果不想看,直接看我的文章即可。
【Flask框架】—— 视图和URL总结
python+web+flask轻量级框架的实战小项目。登录功能,后续功能可自行丰富。
有了这个就可以配置可信IP,关键是不需要企业认证,个人信息就可以做。
本专栏是对Flask官方文档中个人博客搭建进行的归纳总结,与官方文档结合事半功倍。 本人经验,学习一门语言或框架时,请首先阅读官方文档。学习完毕后,再看其他相关文章(如本系列文章),才是正确的学习道路。
本专栏是对Flask官方文档中个人博客搭建进行的归纳总结,与官方文档结合事半功倍。基础薄弱的同学请戳Flask官方文档教程 本人经验,学习一门语言或框架时,请首先阅读官方文档。学习完毕后,再看其他相关文章(如本系列文章),才是正确的学习道路。 如果python都完全不熟悉,一定不要着急学习框架,请首先学习python官方文档,一步一个脚印。要不然从入门到放弃是大概率事件。 Python 官方文档教程
快到年末了 相信大家都在忙着处理年末数据 刚好有一个是对超市的商品库存进行分析的学员案例 真的非常简单~
一个简易的问答系统就这样完成了,当然,这个项目还可以进一步完善,比如 将数据存入Elasticsearch,通过它先进行初步的检索,然后再通过这个系统,当然我们也可以用其他的架构实现。如果你对这系统还有其他的疑问,也可以再下面进行留言!!!
#模版继承和页面之间的调用@app.route(&quot;/bl&quot;)def bl(): return render_template(&quot;file_2.html&quot;)主ht
#form表达提交@app.route(&quot;/data&quot;,methods=[&#39;GET&#39;,&#39;POST&#39;]) #methods 让当前路由支持GET 和
#form表达提交@app.route(&quot;/data&quot;,methods=[&#39;GET&#39;,&#39;POST&#39;]) #methods 让当前路由支持GET 和
#session 使用app.secret_key = &quot;dsada12212132dsad1232113&quot;app.config[&#39;PERMANENT_SESSION_LI
#文件上传@app.route(&quot;/file&quot;,methods=[&#39;GET&#39;,&#39;POST&#39;])def file(): if request.meth
#跳转操作:redirect@app.route(&quot;/red&quot;)def red(): return redirect(&quot;/login&quot;)
#session 使用app.secret_key = &quot;dsada12212132dsad1232113&quot;app.config[&#39;PERMANENT_SESSION_LI
@app.route(&quot;/req&quot;,methods=[&#39;GET&#39;,&#39;POST&#39;])def req(): print(request.headers)
#模版继承和页面之间的调用@app.route(&quot;/bl&quot;)def bl(): return render_template(&quot;file_2.html&quot;)主ht
#文件操作:send_file,支持图片 视频 mp3 文本等@app.route(&quot;/img&quot;)def img(): return send_file(&quot;1.jpg&q