在线做网站索引,个人免费网页,销售平台,听书369进入公众号Python基础学习#xff1a;
Pyhton 语法基础Python 变量Python控制流Python 函数与类Python Exception处理Python 文件操作Python 日期与时间Python Socket的使用Python 模块Python 魔法方法与属性
Flask基础学习#xff1a;
Python中如何选择Web开发框架#xff1f;Pyth… Python基础学习
Pyhton 语法基础Python 变量Python控制流Python 函数与类Python Exception处理Python 文件操作Python 日期与时间Python Socket的使用Python 模块Python 魔法方法与属性
Flask基础学习
Python中如何选择Web开发框架Python Flask 入门开发如何使用virtualenv实现python环境的隔离Python中使用国内源头下载依赖Python Flask 路由配置Flask 使用Context上下文Python Flask实现蓝图Blueprint配置和模块渲染
蓝图BluePrint
蓝图Blueprint是Flask实现的应用模块化通过模块化的方式分割视图让应用的层次更加清晰更加便于开发者开发和维护项目。通过蓝图我们可以创建一组相同前缀的路由组合可以用于分割应用不同的服务。如应用有两个服务认证服务和用户服务我们可以通过模块化分割服务然后通过Flask注册不同前缀的蓝图。 创建main服务
先创建一个main服务代码如下
1、创建main.py文件
# main.py
# /usr/bin/env python
# -*-coding:utf-8 -*-
from datetime import datetime
from flask import render_template,session,redirect,url_for,abort,request,Blueprint
main Blueprint(main, __name__)main.route(/index)
def index(item_namedashboard, **kwargs):return render_template(manager/index.html, item_nameitem_name, kwargskwargs)main.route(/user/username)
def user(username):return render_template(user.html, useruser)
2、创建api.py文件
# /usr/bin/env python
# -*-coding:utf-8 -*-
from flask import jsonify, request,make_response,Blueprint,Flask
from. import apiapi.route(/post/, methods[POST])
def post():json request.jsonprint(str(json))post1 Post.from_json(json)db.session.add(post1)db.session.commit()return jsonify({status: 1,response: u提交成功})
3、注册Blueprint
# /usr/bin/env python
# -*-coding:utf-8 -*-
from flask import Flask,render_template,Response
from flask_cors import CORSdef create_app(config_name):app Flask(__name__)# 注册main服务from .main import main as main_blueprintapp.register_blueprint(main_blueprint, url_prefix/manager)# 注册api服务from app.api import api as api_blueprintCORS(api_blueprint, supports_credentialsTrue)app.register_blueprint(api_blueprint, url_prefix/api/v1.0)return app 模块渲染Template)
使用Flask可以直接在路由中返回Html文档但处理起来比较麻烦。因此Flask框架默认支持Jinja2末班引擎可通过flask提供的内置方法render_template直接进行渲染我们只需要提供html的相对路径即可flask中默认模板目录为templates。
如下通过一个示例看下flask中的模板渲染如何使用
from flask import render_template,Flaskapp Flask(__name__)app.route(/hello/)
app.route(/hello/name)
def hello(nameNone):return render_template(base.html, namename)if __name__ __main__:app.run()
Jinja2 模板引擎
Jinja2 是一个现代的设计者友好的仿照 Django 模板的 Python 模板语言。 它速度快被广泛使用并且提供了可选的沙箱模板执行环境保证安全:4
title{% block title %}{% endblock %}/title
ul
{% for user in users %}lia href{{ user.url }}{{ user.username }}/a/li
{% endfor %}
/ul
变量使用
Flask可以通过Jinja2模板将Python中的变量传递到html模板中。如下通过py和html中来了解如何使用
// demo.py
from flask import Flask, render_templateapp Flask(__name__)app.route(/args)
def temp_jinja2():data {Python: 编程语言,Flask: Web 框架,Jinja2: 模板引擎,HTML: 前端语言}return render_template(route_two.html, datadata)if __name__ __main__:app.run(debugTrue)
如上通过render_template传递jinja2参数。html使用变量如下
!DOCTYPE html
html langen
headmeta charsetUTF-8titleJinja2 Args/title
/head
body
h2 stylecolor: red获取 data 中的数据/h2
p stylecolor: blue {{ data[Python] }} /p
p stylecolor: blue {{ data[Flask] }} /p
p stylecolor: blue {{ data.Jinja2 }} /p
p stylecolor: blue {{ data.HTML }} /p
br/
{% if data %}{{ data.keys() }}
{% else %}p stylecolor: blue Hello Jinja2 ! /p
{% endif %}
br/
br/
{% for key in data.keys() %}divp stylecolor: rebeccapurple {{ key }} : {{ data[key] }} /p/div
{% endfor %}
/body
/html
过滤器
Flask中模板过滤器的使用是通过管道符|分割也 可以用圆括号传递可选参数。多个过滤器可以链式调用前一个过滤器的输出会被作为 后一个过滤器的输入。如 {{ name|striptags|title }} 会移除 name 中的所有 HTML 标签并且改写 为标题样式的大小写格式。其使用格式如下
// 使用格式
{% 变量 | 过滤器名 %} // 示例
{# 关闭HTML自动转义 #}
p{{ emname/em | safe }}/p 常见的内置过滤器
abs(number)返回参数的绝对值。attr(obj, name)获取对象的属性。 foo|attr(‘bar’) 像 foo[‘bar’] 一样工作只是总是返回一个属性并且不查找项目。batch(value, linecount, fill_withNone)批处理项目的过滤器。它的工作原理与 slice 非常相似只是反过来。它返回具有给定项目数的列表列表。如果您提供第二个参数则该参数用于填充缺失的项目。capitalize(s)大写一个值。第一个字符将是大写的所有其他字符都是小写的。center(value, width80)将给定宽度的字段中的值居中。default(value, default_valueu”, booleanFalse)如果该值未定义它将返回传递的默认值否则返回值。dictsort(value, case_sensitiveFalse, by’key’)对 dict 和 yield (key, value) 对进行排序。escape(s)将字符串 s 中的字符 、 、 、 ‘ 和 ” 转换为 HTML 安全序列。如果您需要在 HTML 中显示可能包含此类字符的文本请使用此选项。将返回值标记为标记字符串。filesizeformat(value, binaryFalse)将值格式化为“人类可读”的文件大小即 13 kB、4.1 MB、102 字节等。默认使用十进制前缀Mega、Giga 等如果第二个参数设置为 True则使用二进制前缀Mebi、Gibifirst(seq)返回序列的第一项。float(value, default0.0)将值转换为浮点数。如果转换不起作用它将返回 0.0。您可以使用第一个参数覆盖此默认值。forceescape(value)强制 HTML 转义。这可能会使转义变量加倍。format(value, *args, **kwargs)在对象上应用 python 字符串格式。groupby(value, attribute)按公共属性对一系列对象进行分组。indent(s, width4, indentfirstFalse)返回传递的字符串的副本每行缩进 4 个空格。第一行没有缩进。int(value, default0)将值转换为整数。如果转换不成功它将返回 0。join(value, du”, attributeNone)返回一个字符串它是序列中字符串的串联。last(seq)返回序列的最后一项。length(object)返回序列或映射的项目数。list(value)将值转换为列表。如果它是一个字符串则返回的列表将是一个字符列表。lower(s)将值转换为小写。map()对一系列对象应用过滤器或查找属性。这在处理对象列表时很有用但您实际上只对它的某个值感兴趣。pprint(value, verboseFalse)漂亮地打印一个变量。对调试很有用。random(seq)从序列中返回一个随机项。reject()通过对对象或属性应用测试并拒绝测试成功的对象来过滤一系列对象。rejectattr()通过对对象或属性应用测试并拒绝测试成功的对象来过滤一系列对象。replace(s, old, new, countNone)返回值的副本所有出现的子字符串都替换为新的子字符串。reverse(value)反转对象或返回一个迭代器以相反的方式迭代它。round(value, precision0, method’common’)将数字四舍五入到给定的精度。safe(value)将该值标记为安全的这意味着在启用了自动转义的环境中该变量将不会被转义。select()通过对对象或属性应用测试并仅选择测试成功的对象来过滤一系列对象。selectattr()通过对对象或属性应用测试并仅选择测试成功的对象来过滤一系列对象。slice(value, slices, fill_withNone)切片迭代器并返回包含这些项目的列表列表。sort(value, reverseFalse, case_sensitiveFalse, attributeNone)对可迭代对象进行排序。默认情况下它按升序排序如果您将它作为第一个参数传递 true 它将反转排序。string(object)如果还没有请创建一个字符串 unicode。这样标记字符串就不会转换回 unicode。striptags(value)去除 SGML/XML 标签并将相邻的空格替换为一个空格。sum(iterable, attributeNone, start0)返回数字序列加上参数“start”的值默认为 0的总和。当序列为空时它返回开始。title(s)返回值的标题版本。 IE。单词将以大写字母开头所有其余字符均为小写字母。trim(value)去除前导和尾随空白。truncate(s, length255, killwordsFalse, end’…’)返回字符串的截断副本。长度由第一个参数指定默认为 255。upper(s)将值转换为大写。urlencode(value)用于 URL 的转义字符串使用 UTF-8 编码。它接受字典和常规字符串以及成对的可迭代对象。urlize(value, trim_url_limitNone, nofollowFalse)将纯文本的 URL 转换为可点击的链接。wordcount(s)计算该字符串中的单词。wordwrap(s, width79, break_long_wordsTrue, wrapstringNone)返回传递给过滤器的字符串副本在 79 个字符后换行。xmlattr(d, autospaceTrue)根据字典中的项目创建 SGML/XML 属性字符串。
示例代码
视图函数
from flask import Flask, render_template# todo 初始化Flask项目的服务
app Flask(__name__)student {name: kobe, age: 14, gender: 男}app.route(/str)
def test1():return render_template(04-字符串的过滤器.html,**student) #为了方便在模板中使用可以把字典打伞if __name__ __main__:# 0.0.0.0代表当前的系统的所有的ip地址,# 设置端口为8080# flask的debug模式把错误的信息显示到页面中app.run(host0.0.0.0, port8080, debugTrue)模板文件
!DOCTYPE html
html langen
headmeta charsetUTF-8title字符串的过滤器/title
/head
body{# 当变量数据没有传入数据的时候可以给变量设置默认值 #}
p{{ name | default(自律) }}/p
P{{ name1 | default(自爱) }}/P{# 单词首字母大写 #}
p{{ hello world | capitalize }}/p {# 单词全小写 #}
p{{ XML | lower }}/p {# 去除字符串前后的空白字符 #}
p{{ hello | trim }}/p {# 字符串反转返回olleh #}
p{{ hello | reverse }}/p {# 格式化输出返回Number is 99 #}
p{{ %s is %d | format(Number, 99) }}/p {# 关闭HTML自动转义 #}
p{{ emname/em | safe }}/p {% autoescape false %}{# HTML转义即使autoescape关了也转义可以缩写为e #}
p{{ emname/em | escape }}/p
{% endautoescape %}
/body
/html 静态文件配置
Flask框架默认静态文件的目录为根目录下的static目录默认模板文件目录为templates或者也可以通过Flask来设置静态文件目录、模板目录、以及静态访问前缀。Flask支持的设置参数如下 def __init__(self,import_name: str, static_url_path: t.Optional[str] None,static_folder: t.Optional[t.Union[str, os.PathLike]] static,static_host: t.Optional[str] None, host_matching: bool False,subdomain_matching: bool False,template_folder: t.Optional[str] templates,instance_path: t.Optional[str] None,instance_relative_config: bool False,root_path: t.Optional[str] None,)
如下我们可以通过一个示例来看一下如何设置
from flask import Flaskapp Flask(import_name__name__,static_url_path/,static_folderstatic,template_foldertemplates)
如下通过一个示例来看下如何配置静态文件。
创建main.py
from flask import Flask, render_templateapp Flask(import_name__name__, static_url_path/,static_folderstatic, template_foldertemplates)# 添加html访问路由
app.route(/)
def blog():return render_template(index.html)if __name__ __main__:app.run() # 默认设置host:0.0.0.0 port:5000
创建静态文件和模板文件
如下所示在模板中我们可以通过url_for来访问获取静态文件格式如下
url_for(static-folder,static-relative-path) # 社会静态目录和相对静态目录的静态文件地址 访问结果