简单开发所需了解的
传递URL参数
通过使用route()方法可以将一个普通函数和特定的URL关联起来,而一个函数可以使用多个URL装饰器来装饰,可以实现多个URL请求由一个函数产生的内容回应(01),获取的URL参数需要在URL装饰器和业务函数中分别进行定义和处理。
一般有如下两种形式的URL变量规则(URL装饰器中的URL字符串写法)(02表单发送post请求)
/hello/<name> # 一般是字符串Url链接中的传给<name>
/hello/<int:id> # 一般是数字Url链接中的传给<name>
使用会话和cookie(04)
使用会话和cookie可以存储客户端与服务端的交互状态。
在Flask框架中获取cookie
flask.request.cookies.get('name')
使用make_response对象设置cookie
resp = make_respone(content) # content返回页面内容
resp.set_cookie('username','the username') # 设置名为username的cookie
使用Flask-script扩展(05)
该插件自带了一组常用选项,而且还支持自定义命令。
可以输入当前网站的ip地址和端口作为运行。这可以不再脚本中把参数传递给app.run()函数,采用命令行的方式传递更加友好。
使用模板(06)
模板是一个包含响应文本的文件。其中包含用占位变量表示的动态部分,其具体值在请求的上下文中才能直到。使用真实值替换变量,在返回最终响应的字符串,这一过程称为渲染。
模板变量
{{ name }},这是一种特殊的占位符,用于告诉模板引擎这个位置的值从渲染模板时使用的数据中获取,模板变量中的数据可以是很多种类型的数据,如列表,字典和对象(对象可以使用.方法函数)。
过滤器
把过滤器添加在变量名之后,在中间用竖线分隔,{{ name|safe }}
Jinja2提供的常用模板过滤器
safe:在渲染值时不转义
capitalize:把值得首字母转换才大写形式,其他字母转换为小写
lower:把值转换为小写
upper:把值转换为大写
title:把值中每个单词首字母转换为大写
trim:把值得首位空格去掉
striptags:渲染之前把所有值中所有得HTML标签都删掉。
特别需要注意,有时候模板变量若是html标签,如<h1>hello</h1>
,这时候模板变量渲染会将其转化为<h1>hello</h1%gt;
这就达不到我们想让浏览器来解释这个标签得意思,所以可以使用safe过滤器,这时候该标签就会以html标签样式展现出来。
控制结构
{% if value %}
hello , {{ value }}
{% else %}
hello , you
{% endif %}
for循环
<ul>
{% for comment in comments %}
<li>{{ comment }}</li>
{% endfor %}
</ul>
宏功能(类似python的函数)
1、把它看作jinja2的一个函数,这个函数可以返回一个html字符串
2、目的:代码可以复用,避免代码冗余
在模版中直接定义:类似于macro1.html中定义方式
{% macro render_comment(comment) %}
<li>{{ comment }}</li>
{% endmacro %}
<ul>
{% for comment in comments %}
{{ render_comment(comment)}}
{% endfor %}
</ul>
将所有的宏提取到一个模版中macro.html,重复使用宏功能,可以将他保存在单独的文件中,并在需要导入的模板中导入。
导入方法:
{% import 'macro.html' as macros %}
<ul>
{% for comment in comments %}
{{ macros.render_comment(comment) }}
{% endfor %}
模板继承(08)(在我的谷歌浏览器中更改html文件样式并不会马上刷新在浏览器中更改,需要退出,重新运行)
编写个base.html文件,然后再在该文件中使用{% block head %} {% endblock %};{% belock body %}{% endblock %};{% block script %}{% endblock %}等这些使用block标签。然后在继承的文件中在这些定义的block标签中进行修改,叫修改。
使用{% extends 'base.html' %}在需要继承文件的顶部填写。
要在继承的文件中'复用',使用{{ super() }},缘由是继承只要你导入了,就算没输入,也就是空,那你这个子类也就是空,导入是指导入了block标签{% block name %},要么不导入,就是继承,这可不像多态,可以共存,有点像类变量,父元素的类变量大导入如果你初始化__init__(self)了,需要导入父元素的类变量,需要使用super()函数。
使用Flask-Bootstrap扩展
pip install flask-bootstrap
(07)
该插件是集成的Bootstrap组件,只需初始换Flask-Bootstrap之后,就可以在程序中使用一个包含所有Bootstrap文件的基模板。
from flask import Flask,render_template
from flask_bootstrap import Bootstrap
app = Flask(__name__)
bootstrap = Bootstrap(app) #初始化Bootstrap组件在该程序中
使用Flask-Momment扩展本地化日期和时间
Momment.js是一个简单易用的轻量级javascript日期处理类库,提供了日期格式化和解析功能。
初始化Flask-Momment的代码
from flask.ext.moment import Moment
moment =Moment(app)
Flask-Momment依赖于moment.js和jquery.js,这两个文件需要直接包含在HTML文档中。
在HTML标签中导入moment.js和jquery.js
{{ moment.include_jquery() }}
{{ moment.include_moment() }}
<!--使用中文,默认是英文>
{{ moment.lang('zh-CN')}}
表单操作(09)(若同时应用多个class,如果有相当的定义,那么后定义的优先)
pip install flask-wtf
在默认情况下flask-wtf能防止所有表单收到跨站请求伪造攻击(CSRF攻击),他需要为程序设置一个密钥,flask-wtf使用这个密钥生成加密令牌,再用令牌验证请求中表单数据的真伪。
app = Flask(__name__)
app.config['SECRET_KEY'] = 'aaa'
app.config字典用来存储框架,扩展和程序本身的配置变量,使用标准的字典句法就能把配置值添加到app.config对象中。
WTForms可以支持如下HTML标准字段
- StringField:文本字段
- TextAreaField:多行文本字段
- PasswordField:密码文本字段
- HiddeField:隐藏文本字段
- DateField:文本字段,值为datetime.date格式
- DateTimeField:文本字段,值为datetime.datetime格式
- IntegerField:文本字段,值为整数
- DecimalField:文本字段,值为decimal.Decimal
- FloatField:文本字段,值为浮点数
- BooleanField:复选框,值为True和False
- RadioField:一组单选框
- SelectField:下拉列表
- SelectMultipleField:下拉列表,可选择多个值
- FileField:文件上传字段
- SubmitField:表单提交按钮
- FormField:把表单作为字段嵌入另一个表单中
- FieldList:一组指定类型的字段
在WTForms中包含如下内置验证函数
- Email:验证电子邮件地址
- EqualTo:比较两个字段的值,常用于要求对两次输入的密码进行确认的情况
- IPAdress:验证IPV4网络地址
- Length:验证输入字符串的长度
- NumberRange:验证输入的值在数字范围内
- Optional:当无输入值时跳过其他验证函数
- Required:确定字段中有数据
- Regexp:使用正则表达式验证输入值
- URL:验证URL
- AnyOf:确保输入值在可选值列表
- Noneof:确保输入值不在可选值列表中
使用文件上传(10)
form(表单中)的enctype属性值
1.application/x-www-form-urlencoded:在发送前编码所有字符(默认)
2.multipart/form-data: 不对字符编码,或在使用包含文件上传控件的表单时,必须使用该值。
3.text/plain:空格转换为 "+" 加号,但不对特殊字符编码。
form中的action
必需的 action 属性规定当提交表单时,向何处发送表单数据。
绝对 URL - 指向其他站点(比如 src="www.example.com/example.htm")
相对 URL - 指向站点内的文件(比如 src="example.htm")
action="" //一般可以为空的,这里的双引号都要有的,表示提单提交给自己(也就是当前页处理)
如果是 action="?" 就是提交给自己 ,提交到本目录的默认主页(与上方是不同的)
使用数据库
pip install flask-sqlalchem
数据库使用URL指定。其中流行的数据库引擎采用的数据库URL格式如下:
- MySQL:mysql://username:password@hostname/database
- Postgres:postgresql://username:password@hostname/database
- SQLite(Unix):sqlite:////absolute/path/to/database
- SQLite(Windows):sqlite:///c:absolute/path/to/database
hostname本地指的是localhost
收发电子邮件
pip install flask-mail