Flask开发Web(2)

一、前言

本文是基于阅读Flask 1.0.2中文文档,记录自己的实践。主要内容时摘抄文档,仅作为个人的学习笔记。

二、最简单的应用

通过Flask框架,创建最简单的Web应用。

(1)在项目目录中,创建一个hello.py文件。(注意不能保存为flask.py,不然会与Flask本身引起冲突

(2)编写hello.py的代码,如下:

from falsk import Flask        #导入Flask类,是我们的WSGI程序,即网关程序

app = Flask(__name__)      #创建一个网关实例,第一个参数是应用模块或者包的名称(单一的模块应使用__name__)

@app.route('/')                    #通过Flask的route()函数,指定触发函数的URL,返回需要显示在浏览器的信息

def hello_world():                #定义函数

      return 'hello world!'

if __name__ == '__main__'     #判断脚本是否被python直接执行,而不是作为模块导入

       app.run ()                        #运行脚本    若要以调试模式运行,则可加上app.debug =  True或app.run(debug=True)

(3)直接执行文件    python hello.py,返回Web地址(默认是  http://127.0.0.1:5000),此时是生产环境。(调试模式打印的信息较详细)

(4)在浏览器访问 http://127.0.0.1:5000 地址,即可看到hello world!的字样。

三、简单应用了解

每个应用程序的包含app.run()函数的,都是程序入口,即服务器的启动文件。

(一)Flask实例对象

每个程序,都需要有一个网关实例,即  app = Flask(指定程序名称)

(二)路由

用于根据请求的URL找到对应的处理函数获得相应数据,因为Web应用的不同路径会有不同的处理函数。

@app.route():就是指定函数对应的访问URL地址;(‘/’)是根URL的根路径。

可分为静态路径和动态路径:

静态路径:字符串指定路径;(例:('/hello'))

动态路径:即在URL中添加变量的部分,该部分会作为命名参数传递到函数中;(变量的格式为  <variable_name>,若要指定变量的转换器,则格式为 <converter : variable_name>)variable_name=变量名,应与函数参数名相同,converter=转换器,即待转换的数据结构,支持如下数据结构:

string:缺省值,接受任何不包含斜杆的文本

int:接受正整数

float:接受正否点数

path:类似string ,但可以包含斜杆

uuid:接受UUID字符串

(1)URL唯一/重定向行为

若我们在路由的定义时,末尾是否添加反斜杠,我们浏览器访问地址时,地址末尾是否有添加反斜杠会有不同结果。

路由定义时有反斜杠,URL访问时没有fan反斜杠,会自动不全(即加上反斜杠),即加不加都能正常访问;

路由定义时有反斜杠,URL访问时加上了反斜杠,会提示404错误。

(2)构造URL

除了上面通过@app.route()方式为函数定义匹配的路由,我们还可以通过Flask的url_for来生成函数的匹配路由(前提是函数有定义路由,即前面提到的)

例子:假如我们的指定的 login()函数的路由为(‘/hello/login’),则  url_for('login')  返回的结果就是‘/hello/login’。

其他例子:

url_for('login')   =   /hello/login

url_for('login',next='/')  = /hello/login?next=/

若 @app.route('/login/<username>')    则 url_for('login',username = 'xiaoma') =  /login/xiaoma

构造URL的好处:

1、描述性好,改动时允许一次性修改URL,而不用逐个修改;

2、URL构建会转义特殊字符和Unicode数据,省去转义的麻烦;

3、如果应用不位于URL的根路径,url_for()会妥善处理该问题。

访问静态文件:

静态文件,即存放在项目中的文件,例如图片、视频,样式(css)、静态网页等,Flask的url_for()支持访问该类文件。

方式:在包中或模块所在的目录创建一个名为static的文件夹,则可在通过('/static')访问,例如:url_for('/static',filename='文件名加后缀')   注意:static文件夹必须与Flask实例的创建处于同等级目录。

(3)HTTP访问(需要导入request)

定义函数的访问路由时,若不指定http的访问类型,则默认时Get请求,若要改变请求函数,可以通过route()装饰器的menthods参数改变,mentods = ['GET','POST']   指定支持的请求方式 (前面指同时支持GET和POST), @app.route('/login',methods=['GET','POST'])  

在函数中,通过request.method可以获取当前请求的方式,返回的时字符串。从而根据不同请求方式执行不同操作。

(4)渲染模板

根据模板,生成HTML文件,实现数据与视图的分离(需要导入render_template)。

作用:在python内部生成HTML是笨拙,且需要自己处理HTML的转义,不利于开发。

(1)简单使用

1、创建templates文件夹,需与Flask实例的创建同级,即在同一个目录,类似static;

2、创建模版,实质就是保存在templates文件夹中的html文件;

3、在新建的html文件中,若需要使用获取数据(参数),采用以下形式定义:

{% 条件语句 %}  如 if  else  ...     使用变量 ,则用双花括号   {{变量名}},详细yued阅读Jinja2文档

4、在python文件中,通过 render_template(‘html文件’,html文件中的变量名 = 值),把数据渲染到html中。

(2)模版继承

作用:可以使每个页面的特定元素(页头、导航和页尾)保持一致。(这是Jinja2框架最有力的部分)

1、在父类定义可被继承重载的模块  {%  block  模块名 %}(块的开始)  {%  endblock  %}(块的结束)

2、子类继承父类模版html,格式:{% extends "父类文件" %}

3、重载相应模块:{%  block  模块名 %}重载的编码,即嵌入父类相应块中 {%  endblock  %}

4、子类加载父类的内容,使用{{super()}}使用。

(3)转义过滤器

由于在Jinja2中,自动转义是默认开始的,因此如果数据包含HTML,会被自动转义,如何避免自动转义呢,我们可以选择过滤一些安全的数据(安全视为无需转义)。

过滤的方式:

(1)Markup类标记:使用前需导入Markup类

'tag':Markup('<a href="#">点击</a>')        把内容作为参数放入Markup实例中

(2)|safe过滤器:

在Html中,在相应的数据变量右边加上  |safe  ,则相应的变量指定的内容不会转义。

猜你喜欢

转载自blog.csdn.net/chen_courage/article/details/81134152