flask web 能 Flask框架怎么样

一、Python的Flask框架中web表单

下面为你介绍了Python的Flask框架中web表单的教程,表单是学习各个web框架中的基础知识,需要的朋友可以参考下

概要

在前面章节我们为主页定义了一个简单的模板,部分尚未实现的模块如用户或帖子等使用模拟的对象作为临时占位。

本章我们将看到如何利用web表单填补这些空白。

web表单是web应用中基本的构建要素,我们将通过表单来实现用户发帖和应用登录功能。

完成本章内容你需要基于前面章节完成的微博应用代码,请确认这些代码已安装并能正常运行。

配置

Flask-WTF是WTForms项目的Flask框架扩展,我们将用他来帮助我们处理web表单。

大部分Flask扩展都需要定义相关配置项,所以我们先来在应用根目录下创建一个配置文件以备使用。我们先这样创建(fileconfig.py):

SRF_ENABLED= True

SECRET_KEY= you-will-never-guess

很简单吧,这是Flask-WTF需要用到的2个配置项。CSRF_ENABLED配置启用了跨站请求攻击保护,大部分情况下你都需要开启此功能,这能使你的应用更安全。

SECRET_KEY设置当CSRF启用时有效,这将生成一个加密的token供表单验证使用,你要确保这个KEY足够复杂不会被简单推测。

现在这个配置文件已经基本可用了。项目创建完成我们可以创建如下文件并编辑(fileapp/__init__.py):

?

from flask import Flask

app= Flask(__name__)

app.config.from_object(config)

from app import views

用户登录表单

使用Flask-WTF创建的表单就像一个对象,需要从Form类继承子类。然后在这个子类中定义一些类的属性变量作为表单字段就可以了。

我们要创建一个登录表单,用来进行用户身份识别。但跟平常需要验证用户名和密码的登录方式不同,我们将使用 OpenId来处理登录过程。使用OpenId的好处就是我们不用管那些用户名和密码的认证过程,交给 OpenId去搞定,它会返回给我们用户验证后的数据。这样对于使用我们网站的用户而言也更安全。

使用 OpenId登录只需要一个字符串,然后发送给 OpenId服务器就行了。另外我们还需要在表单中加一个“记住我”的选项框,这个是送给那些不想每次来我们网站都要进行身份认证的人。选择这个选项后,首次登录时会用cookie在他们的浏览器上记住他们的登录信息,下次再进入网站时就不需要进行登录*作。

开始我们的第一个表单吧(fileapp/forms.py):

?

from flask.ext.wtf import Form, TextField, BooleanField

from flask.ext.wtf import Required

class LoginForm(Form):

openid= TextField(openid, validators= [Required()])

remember_me= BooleanField(remember_me, default= False)

欣赏一下这个类,多么的简洁,多么的一目了然。如此简单,但又十分的富有内涵。我们引入了一个 Form类,然后继承这个类,按需求还添加了 TextField和 BooleanField这两个字段。

另外还引入了一个表单验证函数 Required,这种验证函数可以附加在字段里面,在用户提交表单时它们会用来检查用户填写的数据。这个 Required函数是用来防止用户提交空数据。Flask-WTF中还有很多不同作用的表单验证函数,我们将会在后面使用到它们。

表单模板

现在我们的问题就是需要一个显示这个登录表单的模板。好消息是我们刚刚创建的登录表单类知道如何把字段转换成HTML,所以我们只需要把注意力集中到页面布局上。下面就是我们的登录表单的模板(fileapp/templates/login.html):

-- extend from base layout--

{% extends base.html%}

{% block content%}

h1Sign In/h1

form action= method=post name=login

{{form.hidden_tag()}}

p

Please enter your OpenID:br

{{form.openid(size=80)}}br

/p

p{{form.remember_me}} Remember Me/p

pinput type=submit value=Sign In/p

/form

{% endblock%}

容我_嗦一下,在这个模板中,我们又一次使用了模板继承的方式。使用 extends语句从 base.html继承模板内容。我们会在后面创建的模板中继续使用这种方式,这样可以使我们所有的页面布局保持一致。

这个登录模板跟普通的HTML表单有些明显的区别,它使用模板参数{{...}}来实例化表单字段,而表单字段又来源于我们刚刚定义的表单类,模板参数中使用了 form这个名称。当我们使用视图函数引用表单类并渲染到模板时,我们要特别注意这个把表单类传递到模板的变量名。

我们在配置中开启了CSRF(跨站**请求)功能,模板参数{{ form.hidden_tag()}}会被替换成一个具有防止CSRF功能的隐藏表单字段。在开启了CSRF功能后,所有模板的表单中都需要添加这个模板参数。

我们定义的表单对象中的字段同样也能被模板渲染,只需要在模板合适的位置添加类似于{{ form.field_name}}这样的模板参数,相关字段就会在被定义的位置出现。另外还有一些字段是可以传参数,比如这个 openid字段,我们就添加了一个参数让它显示的宽度增加到80个字符。

由于我们没有在表单中定义一个提交功能的按钮,所以在这里只能以普通表单字段的方式来做了。不过说起来区区一个按钮,在表单中跟任何数据都没有关系,的确也没有在表单类中定义的必要。

表单视图

见证奇迹的时刻后一步,我们马上要来写一个渲染登录表单对象到模板的视图函数。

这个函数相当的简单无趣,因为我们只需要把表单对象传递给模板就行了。下面就是我们这个视图函数的全部内容(fileapp/views.py):

11

12

from flask import render_template, flash, redirect

from app import app

from forms import LoginForm

# index view function suppressed for brevity

@app.route(/login, methods= [GET, POST])

def login():

form= LoginForm()

return render_template(login.html,

title= Sign In,

form= form)

我们引入登录表单类,然后把它实例化到一个变量,后再把这个变量传给模板。要渲染表单字段必须的事情也就这些。

上面的代码中还引入了两个新对象: falsh和 redirect,这个先甭理它们,稍后才用得上。

另外还做了一件事就是在路由装饰器中添加一个新方法。让 Flask明白我们这个视图函数支持 GET和 POST请求。否则这个视图函数只会响应 GET请求。我们需要得到用户填写表单后提交的数据,这些数据是从 POST请求中传递过来的。

你可以通过在浏览器中测试这个程序来了解上面所说的。按照视图函数关联的路由,你应该在浏览器中输入

由于我们还没有写任何接收数据的代码,所以现在你在页面中点提交按钮还没有任何效果。

从表单中接收数据

另外值得一提的是, Flask-WTF对表单提交数据的处理使我们的接下来要做的事情变得简单了。下面就是我们这个登录视图函数的新版本,加入了表单数据验证和处理(fileapp/views.py):

?

7

8

9

@app.route(/login, methods= [GET, POST])

def login():

form= LoginForm()

if form.validate_on_submit():

flash(Login requested for OpenID=+ form.openid.data+, remember_me=+ str(form.remember_me.data))

return redirect(/index)

return render_template(login.html,

title= Sign In,

form= form)

validate_on_submit()这个方法做了表单处理的所有工作。如果你在表单向用户提供数据时(举个栗子:用户在它之前修改了一下提交的数据)时调用此方法,它会返回 False。发生这样的情况时,你懂的。不懂?就是提交的数据验证不通过,你要继续渲染模板。

在提交请求时调用了表单的 validate_on_submit()方法后,它会从请求中获取所有提交的数据,然后使用表单字段中绑定的验证函数进行数据验证。在所有的数据都验证通过时会返回 True.这就意味着你可以放心的使用这些表单数据了。

只要有一个字段验证不通过,它都会返回 False.这时就需要我们返回数据给用户,让他们来纠正一下错误数据。接下来我们将会看到在数据验证失败时,如何把错误消息显示给用户。

当 validate_on_submit()方法返回 True的时候,我们的视图函数又会调用两个新的函数。它们都是从Flask中引入的,flash函数用来在下一个打开的页面中显示定义的消息。我们现在用它用来做调试。因为我们现在还没有做用户登录模块,所以只需要把用户提交上来的数据显示一下就行了。flash函数非常有用,比如为用户的一些*作提供消息反馈。

flash函数提供的消息不会自动出现在我们的网站页面中,所以我们需要做点事情让它在页面中显示出来。为了让我们所有页面都能有这项激动人心的功能,所以就把它添加到基础模板中吧,下面是更新后的基础模板(fileapp/templates/base.html):

html

head

{% if title%}

title{{title}}- microblog/title

{% else%}

titlemicroblog/title

{% endif%}

/head

body

divMicroblog: a href=/indexHome/a/div

hr

{% with messages= get_flashed_messages()%}

{% if messages%}

ul

{% for message in messages%}

li{{ message}}/li

{% endfor%}

/ul

{% endif%}

{% endwith%}

{% block content%}{% endblock%}

/body

/html

模板中显示 flash消息的功能希望你能明白。

在视图函数中我们使用的另一个新函数就是 redirect.这个函数会通知用户的浏览器跳转到指定的地址。在我们的视图函数中,我们使用它跳转到了首页。注意跳转结束后页面上还会显示 flash函数传递的消息哦。

激动人心的时刻到了,运行我们的程序吧,看看表单是如何工作的吧。不要填写表单中的 openid字段,看看 Required这个验证函数是如何发挥威力,把一切发起空数据的请求阻止在千里之外。

改善一下字段验证

我们程序目前状况不错,提交不合要求的数据会被阻止,还会返回表单让用户修改,基本满足我们要求。

但似乎还少点什么。如果我们在用户提交数据失败后给用户点提示,让他们知道什么原因引起的,岂不妙哉!太幸运了,用 Flask-WTF可以轻松解决这个问题。

当表单字段验证失败时, Flask-WTF会添加一个错误消息到表单对象。这些消息在模板中也是可以使用的,所以我们只需要在模板中添加一点点东西就OK了。

这个就是我们添加了验证消息的登录模板(fileapp/templates/login.html):

16

17

18

!-- extend base layout--

{% extends base.html%}

{% block content%}

h1Sign In/h1

form action= method=post name=login

{{form.hidden_tag()}}

p

Please enter your OpenID:br

{{form.openid(size=80)}}br

{% for error in form.errors.openid%}

span style=color: red;[{{error}}]/span

{% endfor%}br

/p

p{{form.remember_me}} Remember Me/p

pinput type=submit value=Sign In/p

/form

{% endblock%}

我们仅在 openid字段的右边添加了一个循环语句,它会把openid字段验证失败的消息都显示出来。不论你的表单有多少字段,所有表单字段验证失败的错误消息都可以用 form.errors.字段名这种方式来使用。这个表单中我们的是 form.errors.openid。为了让错误消息引起用户的注意,我们还给消息添加了显示红色的 css样式。

处理 OpenID登录

现实生活中,我们发现有很多人都不知道他们拥有一些公共账号。一部分大牌的网站或服务商都会为他们的会员提供公共账号的认证。举个栗子,如果你有一个 google账号,其实你就有了一个公共账号,类似的还有 Yahoo, AOL, Flickr等。

为了方便我们的用户能简单的使用他们的公共账号,我们将把这些公共账号的链接添加到一个列表,这样用户就不用自手工输入了。

我们要把一些提供给用户的公共账号服务商定义到一个列表里面,这个列表就放到配置文件中吧(fileconfig.py):

?

7

8

9

CSRF_ENABLED= True

SECRET_KEY= you-will-never-guess

OPENID_PROVIDERS= [

{ name: Google, url:

{ name: Yahoo, url:

{ name: AOL, url:

{ name: Flickr, url:

{ name: MyOpenID, url:

}]

接下来就是要在我们的登录视图函数中使用这个列表了:

@app.route(/login, methods= [GET, POST])

def login():

form= LoginForm()

if form.validate_on_submit():

flash(Login requested for OpenID=+ form.openid.data+, remember_me=+ str(form.remember_me.data))

return redirect(/index)

return render_template(login.html,

title= Sign In,

form= form,

providers= app.config[OPENID_PROVIDERS])

我们从 app.config中引入了公共账号服务商的配置列表,然后把它作为一个参数通过 render_template函数引入到模板。

接下来要做的我想你也猜得到,我们需要在登录模板中把这些服务商链接显示出来。

24

25

26

27

28

29

30

31

32

33

34

!-- extend base layout--

{% extends base.html%}

{% block content%}

script type=text/javascript

function set_openid(openid, pr)

{

u= openid.search(username)

if(u!=-1){

// openid requires username

user= prompt(Enter your

+ pr+

username:)

openid= openid.substr(0, u)+ user

}

form= document.forms[login];

form.elements[openid].value= openid

}

/script

h1Sign In/h1

form action= method=post name=login

{{form.hidden_tag()}}

p

Please enter your OpenID, or select one of the providers below:br

{{form.openid(size=80)}}

{% for error in form.errors.openid%}

span style=color: red;[{{error}}]/span

{% endfor%}br

|{% for pr in providers%}

a href=javascript:set_openid({{pr.url}},{{pr.name}});{{pr.name}}/a|

{% endfor%}

/p

p{{form.remember_me}} Remember Me/p

pinput type=submit value=Sign In/p

/form

{% endblock%}

这次的模板添加的东西似乎有点多。一些公共账号需要提供用户名,为了解决这个我们用了点 javascript。当用户点击相关的公共账号链接时,需要用户名的公共账号会提示用户输入用户名, javascript会把用户名处理成可用的公共账号,后再插入到 openid字段的文本框中。

下面这个是在登录页面点击 google链接后显示的截图:

二、如何在windows下用flask做web开发

在windows下用flask做web开发步骤:

使用工具:Windows系统电脑、flash、Python。

具体*作:

首先,**PyCharm,默认安装。(**提供python社区免费版,付费版本可以支持flask)

运行PyCharm,点击Files-New Project弹出如下窗口。

新建好项目后,就可以在Terminal下输入指令了,如下图。

除了书上安装扩展的方法外,PyCharm自带更便捷的方法,点击Files-Settings弹出如下窗口。

其他注意:

uwsgi在window下不能使用,可以试一下用fastcgi,不过好还是在linux环境进行开发部署,windows在服务器支持方面不太好。

三、Flask框架怎么样***比起Web***py有哪些不同

Flask是一个使用Python编写的轻量级Web应用框架,凭借更灵活、轻便、安全且容易上手的特性,成为企业常用的Python框架之一。在完成Web前端、Linux以及MySQL相关的课程之后,专业的杭州Python学习班都会讲解Flask框架知识,以下是整理的相关知识点。

Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架。开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。

默认情况下,Flask不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask支持用扩展来给应用添加这些功能,如同是Flask本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。

Flask框架的特点:

1)Flask自由、灵活,可扩展性强,第三方库的选择面广,开发时可以结合自己喜欢用的轮子,也能结合流行强大的Python库;

2)入门简单,即便没有多少web开发经验,也能很快做出网站;

3)非常适用于小型网站;

4)非常适用于开发Web服务的API;

5)开发大型网站无压力,但代码架构需要自己设计,开发成本取决于开发者的能力和经验。

Flask框架运行解释

1.app= Flask(__name__)

创建Flask对象app,Flask类的构造函数只有一个必须指定的参数,即程序主模块或包的名字。在大多数程序中,Python的__name__变量就是所需要的值。

2.@app.route('/')

web浏览器把请求发送给Web服务器,Web服务器再把请求发送给Flask程序实例。程序实例需要知道对每个URL请求运行哪些代码,所以保存了一个URL到Python函数的映射关系。处理URL和函数之间的关系的程序称为路由。在Flask程序中定义路由的简便方式,是使用程序实例提供的app.route修饰器,把修饰的函数注册为路由。route()装饰器告诉 Flask什么样的URL能触发我们的函数。这和Java中的注释有异曲同工之妙。修饰器是Python语言的标准特性,可以使用不同的方式修改函数的行为。惯常用法是使用修饰器把函数注册为**的处理程序。

3.def index():函数

index()函数放在@app.route('/')后面,所以就是把index()函数注册为路由。如果部署程序的服务器域名为,在浏览器中访问后,会触发服务器执行index()函数。

4.@app.route('/user/')

同@app.route('/'),如果部署程序的服务器域名为,在浏览器中访问后,会触发服务器执行下方修饰函数。

5.app.run(debug=True)

程序实例用run方法启动Flask继承Web服务器。

6.if __name__=='__main__'

当Python解释器,读py文件,它会执行它发现的所有代码。在执行代码之前,它会定义一些变量。例如,如果这个py文件就是主程序,它会设置__name__变量为"__main__"。如果这个py被引入到别的模块,__name__会被设置为该模块的名字。

相关文章

海信游戏旗舰电视65E35H价格多少钱

海信游戏旗舰电视65E35H价格多少钱

很多小伙伴在关注海信游戏旗舰电视65E35H怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

川宇USB3.0高速读卡器多功能二合一tf内存卡sd单反相机读卡器C396使用感受分享

川宇USB3.0高速读卡器多功能二合一tf内存卡sd单反相机读卡器C396使用感受分享

很多小伙伴在关注川宇USB3.0高速读卡器多功能二合一tf内存卡sd单反相机读卡器C396怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,...

Ninebot九号平衡车儿童L6白色六一儿童节礼物男孩女孩6-12岁电动车智能双轮腿控9号平衡车10岁以上价格多少钱

Ninebot九号平衡车儿童L6白色六一儿童节礼物男孩女孩6-12岁电动车智能双轮腿控9号平衡车10岁以上价格多少钱

很多小伙伴在关注Ninebot九号平衡车儿童L6白色六一儿童节礼物男孩女孩6-12岁电动车智能双轮腿控9号平衡车10岁以上怎么样?质量好不好?使用测评如何?本文综合已购用户...

MAXCAM适用dji大疆灵眸OSMOPOCKET怎么样

MAXCAM适用dji大疆灵眸OSMOPOCKET怎么样

很多小伙伴在关注MAXCAM适用dji大疆灵眸OSMOPOCKET怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的...

有道英语听力宝复读机学习机英语语文学习提升神器好不好

有道英语听力宝复读机学习机英语语文学习提升神器好不好

很多小伙伴在关注有道英语听力宝复读机学习机英语语文学习提升神器怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品...

科大讯飞翻译机4.0多语种离线语音拍照智能翻译器测评怎么样

科大讯飞翻译机4.0多语种离线语音拍照智能翻译器测评怎么样

很多小伙伴在关注科大讯飞翻译机4.0多语种离线语音拍照智能翻译器怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产...