flask语法
-
路由的写法
@app.route('/string') #路由是字符串,后边不建议加杠,加杠 @app.route('/string/<key>/<int:num>/</float:fnum>/<path:p>/<uuid:uid>') #可以这么套着用,但是必须在下面函数传入参数,key是缺省值是字符串变量 def index(key,num,fnum,p,uid): pass app.url_map #用来输出路由规则
-
request和response对象
- request对象
- request.headers,得到的是一个对象,可以通过get方法拿值,比如可以request.headers.get(‘Host’)得本主机域名或IP
- request.path,得到的是主机后边不带参数的路由
- request.full_path,得到的主机后边是带参数的路由
- request.base_url,得到除了参数外的url
- request.url,得到完整的url
- request.remote_addr,得到用户的主机地址
- request两个重要参数是request.args和request.form,这两个加get方法可以得到get和post提交的数据
- response对象
- response.headers,响应头,主要内容是Content-Type
- response.content_type,得到的是响应的content_type的类型
- response.status_code,得到的是响应状态码,一般是200
- response.status,得到的是200 OK,str类型
- return返回的必须是一个response对象
- Response(字符串,headers_dict),创建一个response对象,使用return返回该对象。默认状态码是‘200 OK’,c-t是text/html
- make_response(),创建一个response对象,使用return返回
- return str,str会自动转成response对象
- return dict,dict会调用jsonify返回响应对象,内容json字符串
- return redirect(),redirect是一个response对象
- return render_template(),render_template也是一个response对象
- return tuple,(response, status, headers)。headers是一个响应头字典,return ‘’, 302, {‘Location’: ‘https://www.baidu.com’}能实现重定向,当然Location可以任意的重定向的值
- request对象
-
模板
-
使用模板就是用模板引擎将相应的页面和数据转换成字符串进行返回
-
@app.route('/') def index(): return render_template('index.html',key=value,key=value,k...) @app.route('route', methods=['GET','POST'], endpoint='string') def index(): #methods来说明可以进入路由的方法,endpoints是反向解析路由的唯一名字 pass
-
{# 流程控制语句是要写在{%%}里,取值写在{{}},且list、dict数据类型的各个值是需要使用.来取 #} {% for x in keys %} {{loop.index}} {#index, index0, revindex, revindex0, first, last, length #} {% endfor %} {% for v in users.0.values() %} {#获取值#} <p>{{ v }}</p> {% endfor %} <hr> {% for k in users.0.keys() %} {#获取键#} <p>{{ k }}</p> {% endfor %} <hr> {% for k,v in users.0.items() %} {#获取键值#} <p>{{ k }}---{{ v }}</p> {% endfor %}
-
{# 过滤器 #} {{ var | default('default') }} var if var else default {{ msg | safe }} safe将会将msg进行解析,默认不解析 {{ n1 | capitalize }} 将n1的首字母大写 {{ x | lower }} {{ y | upper }} {{ msg | reverse }} 反转整个字符串 {{ msg | title }} msg中每一个单词的首字母都大写 {{ '{},{}'.format() }} 同python中一个用法 {{ '%s,%d' | format('5adsf',500) }} {{ msg | truncate(len,True) }} 截取len长的字符串 {# 列表操作 #} {{ lists | first }} {{ lists | last }} {{ lists | length }} {{ lists | sum }} 数字类型 {{ lists | sort }} 数字类型,排序
-
自定义过滤器,两个方式
-
-
模板复用
-
{{ block name }}{{ endblock }}来”挖坑“,通过模板中{{ extends “base.html” }}然后填坑[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
-
在html页面中的src和href中使用{{ url_for(“static”, filename=“file_path”) }}[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
-
{{ include “html_path” }}
-
宏
{% macro f_name(args,kwargs) %} <!--我们需要的模块内容--> {% endmacro %} {% import "html" as f %} {# import就像python中的一样,将文件/模块进行导入并其别名,然后通过别名掉方法,加下一行 #} {{ f.f_name(args,kwargs) }} {# 使用宏一般是有规范的,即在templates文件夹下写一个macro文件夹,里面放一个html文件,该文件里有我们需要的所有宏。然后导入宏时需要注意,所以文件是以templates文件夹为根目录进行的。 #}
-
-
{% set num = 5 %}相当于定义全局变量,{% with x=value[ as ] %}{% endwith%}相当于局部变量
-
重构项目
-
创建一个apps的包,并在该包的init.py文件中创建app的工厂函数,最后在app.py中调用该工厂得到app
#apps/__init__.py: def create_app(): app = Flask(__name__,static_folder='../static',template_folder='../template') app.config.from_object(Config) return app #app.py: app = create_app()
-
在apps中创建项目的程序包,这些包就是各个功能模块。该包中至少有一个view.py的文件,该文件需要定义蓝图来联系app
#apps/user/view.py: user_bp = Blueprint('user', __name__, url_prefix='/user') #user是反向解析的命名空间,/user是路由前缀 @user_bp.route('/hello', methods=['get','post'], endpoint='') #apps.__init__.py: app.register_blueprint(user_bp)
-
-