Flask笔记

Flask笔记
1.对于简单的程序,程序主模块一般命名为app.py. 当然可以使用其他自定义名字;
2.从flask导入Flask, 这个类表示一个Flask程序;
3.app=Flask(name) 传入Flask类构造方法的第一个参数是模块名/包的名称,应使用特殊变量___name__,Python会根据所处的模块来赋予__name__变量相应的值。 对于app.py程序来说,__name__值为app;
4.
“”"
@app.route(’/hi/’) —> 装饰器(URL规则作为参数),’/'前为主域名;
def index(): —> 视图函数;
return ‘

Hello, %s

’ % name
“”"
5. Flask自动发现程序实例的规则:
A.从当前目录寻找app.py和wsgi.py模块,并从中寻找名为app或application的程序实例;
B.从环境变量FLASK_APP对应的值寻找名为app或application的程序实例。

  1. 设置环境变量FLASK_APP: $export FLASK_APP=***
  2. 管理Flask其它环境变量,如果安装了python-dotenv,那么在使用flask run或其他命令时会使用它自动从.flaskenv和.env文件中加载环境变量。
    A. 安装python-dotenv,Flask加载环境变量的优先级是:
    手动设置的环境变量 > .env中设置的环境变量 > .flaskenv设置的环境变量;
    B. .env文件中存储包含敏感信息的环境变量,不能提交到Git上;.flaskenv用于存储和Flask相关的公开环境变量。
  3. $flask run --host=8.0.0.0 --port=8000 #host和port选项也可以通过环境变量Flask_Run_Host和Flask_RUN_Port设置;
  4. FLASK_ENV环境变量用来设置生产环境(默认)或开发环境。 该变量存于.flaskenv中;
    A.开发环境下,调试模式Debug Mode将被开启,这时执行Flask run启动程序会自动激活Werkzeug内置的调试器debugger和重载器reloader.
    B.可以通过FLASK_DEBUG环境变量控制调试模式的开关,1为开启,0为关闭;
  5. 在一个项目中,Flask提供的配置和扩展提供的配置,还有程序特定的配置,这些配置变量都通过Flask对象的app.config属性作为统一的接口来设置和获取,它指向Config类实际上是字典的子类,所以可以像操作其他字典一样操作它, E.G.app.config[‘ADMIN_NAME’] = ‘Peter’
  6. 自定义Flask命令: 通过创建任意一个函数,并为其添加app.cli.command()装饰器,函数名就是命令名称;
    e.g.
    @app.cli.command()
    def hellocom():
    click.echo(‘Hello, Human!’) -> click模块的echo()函数可以在命令行界面输出字符。
    $ flask hellocom
  7. MVC架构: M-model-数据处理; V-view-用户界面; C-controller-交互逻辑。

Char 2
13. http://baidu.com/hellp?name=lisi ->其中,这个URL后面的?name=lisi 部分是查询字符串(query string), URL中的查询字符串用来向指定的资源传递参数。
查询字符串从问号?开始,以键值的形式写出,多个键值对之间使用&分隔;
14. 常见HTTP方法:GET/POST/PUT/DELETE/HEAD/OPTIONS
15. Flask内置的URL变量转换器:string / int / float / path / any / uuid.
16. 请求钩子: before_first_request, before_request, after_request, teardown_request, after_this_request.
e.g.
@app.before_request
def do_something():
pass … # these code will run before every request.
17.常见HTTP状态码:
A.成功-200/201/204
B.重定向-301/302/304
C.客户端错误-400(Bad Request)/401(Unauthorized)/403(Foridden)/404(not found)
D.服务器端错误-500
18.如果在Flask中想手动返回错误响应,可以使用Flask提供的abort()函数:
e.g.
from flask import Flask, abort
@app.route(’/’)
def not_found():
abort(404)
19. MIME类型(也称为media type或content type)-是一种标识文件类型的机制,它与文件扩展名相对应,可以让客户端区分不同的内容类型,并执行不同的操作。
一般格式为“类型名/子类型名”,其中子类型名一般为文件扩展名,比如‘text/html’,‘image/jpg’.
常用数据格式有纯文本、HTML、XML(Extensiable Markup Language可扩展标记语言,一般作为AJAX请求的响应格式,或Web API的响应格式)和JSON.
e.g. return jsonify((name:‘Lisi’,gender:‘male’))
20. Flask中有两种上下文-程序上下文和请求上下文;Page54
21. Flask会在每个请求产生后自动激活当前请求上下文,激活请求上下文后,request被临时设为全局可访问。 Flask中的4个上下文变量:
A. current_app,属于程序上下文,指向处理请求的当前程序实例;
B. g,属于程序上下文,替代Python的全局变量方法,确保仅在当前请求中可用。 用户存储全局数据,每次请求都会重设;
C. request,属于请求上下文,封装客户端发出的请求报文数据;
D. session,属于请求上下文,用于记住请求之间的数据,通过签名的Cookie实现。
e.g. from flask import g
@app.before_request
def get_name():
g.name = request.args.get(‘name’)
22. Flask自动激活程序上下文的4中情况:Page55
A. 使用Flask run启动程序时;
B. 使用旧的app.run()方法启动顺序时;
C. 执行使用@app.cli.command()装饰器注册的flask命令时;
D. 使用flask shell命令启动Python Shell时。
23.AJAX(Async Javascript And XML)-指异步Javascript和XML.AJAX基于XMLHttpRequest可以在不重载页面情况下和服务器进行数据交换。XMLHttpRequest不仅支持HTTP协议,还支持FILE和FTP协议。
24.jQuery属于流行的JavaScript库,可以方便的实现AJAX操作,而且jQuery处理了不同浏览器的AJAX兼容问题。 全局jQuery函数ajax()是底层函数。 ajax()函数支持的参数有url/type/data/dataType/contentType/complete/success/error.
25. 通信模式分为客户端拉取client pull和服务器端的主动推送server push。 实现服务器端推送的一系列技术被合称为HTTP Server Push,目前常用推送技术分为:传统轮询、长轮询、Server-Sent Event(SSE)


Char 3

26.Render-渲染
27.Jinja2是Falsk默认使用的模板引擎。
28.Jinja2里常见的三种定界符:
A. {%…%} 适用于语句,如If, for.etc
B. {{…}} 适用于表达式,如字符串,变量,函数.etc
C. {#…#} 适用于注释。
e.g.
{% if user.bio %}
{{ user.bio }}
{% else %}
This user has no a bio.
{% endif %}
29.视图函数中,使用的是Flask提供的渲染函数render_template(),括号中是模板文件路径+关键字参数变量值。
e.g.
from flask import render_template

return render_template(‘watchlist.html’, user=user, movies=movies)
其中,左边的user表示传入模板的变量名称,右边的user表示要传入的对象。
30. 模板上下文变量
A. Flask在模板上下文中提供的内置变量(标准模板全局变量)有:config/request/session/g.
B. 自定义上下文-Flask提供了一个app.context_processor装饰器,可以用来注册模板上下文处理函数。
e.g. @app.context_processor
def inject_foo():
foo = ‘I am foo.’
return dict(foo=foo) # equal to ‘return (‘foo’:foo)’
31. Jinja2在模板中默认提供了一些全局函数,常用三个是:
A. range([start,]stop[,step]) -和Python中的range()用法相同;
B. lipsum(n=5,html=True, min=20, max=100) -生成随机文本,可以在测试时用来填充页面。默认生成5段HTML文本,每段包含20-100个单词。
C. dict(**items) -和Python中的dict()用法相同。
32. 除了Jinja2内置的全局函数,Flask也在模板中内置了2个全局函数:
A. url_for() -用于生成URL的函数;
B. get_flash_messages() -用于获取flash消息的函数。
33. 自定义全局函数
Page82
除了使用app.context_processor注册模板上下文处理函数来传入函数,还可以使用app.template_global装饰器直接将函数注册为模板全局函数。
@app.template_global()
def bar():
return ‘I am bar.’
Page83
34. 过滤器 - Jinja2中,过滤器filter是一些可以用来修改和过滤变量值的特殊函数,过滤器和变量用一个竖线(管道符号)隔开,需要参数的过滤器可以像函数一样使用括号传递。{{ name|title}}{{ movies|length}}
35. Jinja2常用内置过滤器 Page83
36. 自定义过滤器-使用app.template_filter()装饰器。
37. 测试器-Jinja2中,测试区Tester是一些用来测试变量或表达式,返回布尔值的特殊函数。
e.g.如 number是用来判断一个变量或表达式是否是数字,使用is来连接变量和测试器。{% if age is number %}…
A.Jinja2内置的常用测试器Page86
B.自定义测试器 - 使用Flask提供的app.template_test()装饰器。
38. Jinja2中,渲染行为有jinja2.Environment类控制,所有的配置选项、上下文变量、全局函数、过滤器和测试器都存储在Environment实例上。通过Flask的app.jinja_env属性来创建Environment对象。
39.局部模板 -使用include标签来插入一个局部模板
{% include ‘_banner.html’%}
为 了和普通模板区分开,局部模板的命名通常以一个下划线_开始。
40. 宏Macro. Page88
41. Jinja2的模板继承允许你定义一个基模板(包含网页的导航栏、页脚等通用内容)
42.基模板通常被命名为base.html或layout.html
43.基模板中通过定义块-block,在子模块中可以通过定义同名的块来执行继承操作。
块block的开始和结束分别使用block和endblock标签声明,而且块之间还可以嵌套。
e.g. …
{% block head %}

{% endblock [head]%}
{% block name %}

{% endbloack [name]%}
44. 编写子模板 Page 91
A.{%extends …%}标签声明扩展基模板, extends必须是子模板的第一个标签
e.g. {% extends ‘base.html’ %}
B. 通过Jinja2提供的super()函数进行声明,可以想基模块中的父块添加内容。
{%block styles%}
{{super()}}

{%endblock%}
45. 为了在HTML文件中引用静态文件,需要使用URL_for()函数获取静态文件的URL。Flask内置了用户获取静态文件的视图函数,端点值为static,它的默认URL规则为/static/path:filename, URL变量filename是相对于static文件夹根目录的文件途径。
e.g. url_for(‘static’,filename=‘hi.jpg’) 即可通过127.0.0.1:5000/static/hi.jpg访问

46. 可创建一个存储CSS规则的styles.css文件,使用下面方式在模板中加载此文件:

47.Bootstrap是最流行的开源前端框架之一 Page96 48.使用宏加载静态资源。 49. flash()函数-Flask提供的flash()函数发送的消息会存储在session中(需要为程序通过app.secret_key属性或配置变量SECRET_KEY设置密钥),我们需要在模板中使用全局函数get_flashed_messages()获取消息并将其显示出来。 50. Flask提供了get_flashed_messages()函数用来在模板里获取消息 {% for message in get_flashed_messages() %}
{{message}}
{% endfor %} {% block content %} ... {%endblock%} 51. 当get_flashed_messages()函数被调用时,session中存储的所有信息都会被移除。 52. JavaScript和CSS中的Jinja2 Page101 A. 只有使用render_template()传入的模板文件才会被渲染。

Char 4 WTForms -是一个使用Python编写的表单库;

53.WTForms支持在Python中使用类定义表单,然后直接通过定义生成对应的HTML代码。
54.Flask-WTForms集成了WTForms。 Flask-WTForms将表单数据解析、CSRF保护、文件上传等功能与Flask集成。
$ pip install flask-wtf
55. Flask-WTF默认为每个表单启用了CSRF保护,它会为我们自动生成和验证CSRF令牌Tooken. 默认情况下,Flask-WTF使用程序密钥来对CSRF令牌进行签名,为程序设置密钥方式:app.secret_key=’**
56. 常用的WTForms字段 Page107
57. 实例化字段常用参数 Page 107 - label / render_kw/ validators / default.
58. 常用的WTForms验证器 - DataRequired(message=None) / Email(message=None) / EqualTo(fieldname,message=None) / InputRequired(message=None) / NumberRange(min=
,max=None,message=None)…
59. 在实例化验证类时,message参数用来传入自定义错误消息。
e.g. name = StringField(‘Your Name’,validators=[DataRequired(message=u’名字不能为空!’)])
60. FlaskForm类继承于Flask-WTF(pip install flask-wtf), FlaskForm类
from flask_wtf import FlaskForm…
from wtforms import Form…
from wtforms.validators import DataRequired, Length…
61. WTF_CSRF_ENABLED 用来设置是否开启CSRF保护,默认为True.
62. Flask-WTF 为表单类实例提供了一个form_hidden_tag()方法,用于隐藏字段。


Char 8

63.可以为蓝本实例注册路由、错误处理函数、上下文处理函数、请求处理函数、甚至是单独的静态文件文件夹和模板文件夹。。
from flask import Blueprint
blog_bp = Blueprint(‘blog’,name) - 第二个参数是包或模块的名称;
64. 蓝本一般在子包中创建,比如auth子包,然后在构造文件中创建蓝本实例。
auth_bp = Blueprint(‘auth’,name) #创建蓝本
@auth_bp.route(’/login’)
def login(): #装配蓝本之视图函数

65. 蓝本请求处理函数
A. 蓝本模板上下文处理函数
context_processor 装饰器
app_context_processor装饰器
66. 注册蓝本-使用Flask.register_blueprint()方法注册,必须传入的参数是我们在上面创建的蓝本对象,other参数可以用来控制蓝本的行为。比如url_prefix参数为auth蓝本下的所有视图URL附件一个前缀。
from bluelog.blurprint.auth import auth_bp

app.register_blueprint(auth_bp)
app.register_blueprint(auth_app, url_prefix=’/auth’)
67. 蓝本的路由端点-端点作为URL规则和视图函数的中介媒介。 add_url_rul3(rule,endpoint,view_func)的第二个参数即指定的端点endpoint,第三个参数是视图函数对象. 默认情况下,端点和视图函数的称是一样的,也可以显式地使用endpoint参数改变它:@app.route(’/hello’,endpoint=‘give_greeting’)
def say_hello()…
68. 蓝本资源- 如果沉痼的不同蓝本的页面需要不同的样式,可以为蓝本定义独有的静态文件和模板,这是需要把蓝本模块升级为包。 实例化时传入的__name__变量会被用来判断蓝本的根目录,并以此作为基础寻找模板文件夹和静态文件文件夹。
A. 要使用蓝本独有的静态文件,需要在定义蓝本时使用static_folder关键字指定蓝本的静态文件文件夹的路径:auth_bp=Blueprint(‘auth’,name, static_folder=‘static’,static_url_path=’/auth/static’)
B. 在生成用来获取蓝本静态文件的URL时需要写出包含蓝本名称的完整端点,及‘蓝本名.static’,下面的调用会返回‘admin/static/style.css’:
url_for(‘admin.static’, filename=‘style.css’)
C. 当蓝本包含独有的模板文件夹时,我们可以在实例化蓝本时使用template_folder关键字指定模板文件夹的位置:
admin=Blueprint(‘admin’,name,template_folder=‘templates’)
D. 当我们在蓝本中的视图函数渲染一个index.html模板时,flask会优先从全局的模板文件夹中寻找,如果没找到,再到模板所在的模板文件夹查找。
E. 如果蓝本之间的关联比较大,共用一个基模板,更常见的方法是只在全局的模板文件夹中存储模板,在其中可以建议子文件夹来进行组织,静态文件的处理方式一样。
69. 实际需求中,往往需要不同的配置组合,其中最方便的方法是在单个配置文件中使用Python类来组织多个不同类别的配置。 Page227
70.为了获取数据库文件的路径,使用OS模块的方法创建了一个定位到项目根目录的basedir变量,最终的绝对路径通过os.path模块的方法基于当前脚本的特殊变量__file__获取:basedir = os.path.abspath(os.path.dirname(os.path.dirname(file)))
71.使用app.config/from_object()方法可以加载自定义的存储配置名和对应配置类的字典,从而用来在创建程序实例时通过配置名称来获取对应的配置类。
from bluelog.settings import config
app = Flask(‘bluelog’)
config_name = os.getenv(‘FLASK_CONFIG’,‘development’)
app.config.from_object(config(config_name))
72.使用蓝本的另外一个好处就是–允许使用工程函数来创建程序实例.工厂是指创建其他对象的对象。Page 228
from flask import Flask
from bluelog.settings import config

def create_app(config_name=None):
if config_name is None:
config_name = os.getenv(‘FLASK_CONFIG’,‘development’)
app = Flask(‘bluelog’)
app.config.from_object(config(config_name))

app.register_blueprint(blog)

工厂函数一般在程序包中的构造文件中创建。
A.加载配置- 工厂函数接收配置名称作为参数。
def create_app(config_name=None):
B.初始化扩展- 在实例化扩展类时传入程序实例。大部分扩展都提供了一个init_app()方法来支持分离扩展的实例化和初始化操作。
from bluelog.extensions import bootstrap, db, moment, ckeditor, mail

def create_app(config_name=None):
app = Flask(‘bluelog’)

bootstrap.init_app(app)
db.init_app(app)
moment.init_app(app)
ckeditor.init_app(app)
mail.init_app(app)

return app
C.组织工厂函数 Page 231
73. 启动程序
A. 当使用flask run命令启动程序时,Flask的自动发现程序实例机制还包含另一种行为-Flask会自动从环境变量FLASK_APP的值定义的模块中寻找名为creat_app()或make_app()的工厂函数,自动调用工厂函数创建程序实例并允许。
74. current_app对象-是一个表示当前程序实例的代理对象。当某个程序实例被创建运行时,它会自动指向当前运行的程序实例,并发所有操作都转发到当前的程序实例。current_app是程序上下文全局变量,所以还只有在激活了程序上下文之后才可以使用。
Page 232

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值