flask flask应用 from flask import Flaskapp = Flask (__name__) @app.route ('/' ) def hello_world (): return 'Hello world' if __name__ == '__main__' : app.run ()
rule参数表示与该函数的url绑定
options是要转发给基础rule对象的参数列表
在上面的实例中,’/‘ url与hello_world()函数绑定.因此,当在浏览器中打开web服务器的主页时将呈现该函数的输出.最后,flask类的run()方法在本地开发服务器上运行应用程序
app.run (host,port,debug,options)
host 要监听的主机名,默认为127.0.0.1.设置为0.0.0.0以使服务器在外部可用
port 默认值为5000
debug 默认为false 如果设置为true,则提供调试信息
options 要转发到底层的werkzeug服务器
调试模式 调试模式
app.debug = True app.run ()
另一种是作为run方法的一个参数传入
flask变量规则 要给url添加变量部分,可以把这些特殊的字段标记为<variable_name>,这个部分将会作为命名参数传递到你的函数,规则可以用<converter:variable_name>指定一个可选的转换器.
@app.route ('/user/<username>' ) def show_user_profile (username): return 'User %s' % username @app.route ('/post/<int:post_id>' ) ruturn 'Post %d ' % post_id
转换器种类
int
接受整数
float
同int,但是接受浮点数
path
和默认的相似,但是也接受斜线
唯一的url / 重定向行为
flask的url规则基于werkzeug的路由模块.这个模块背后的思想是基于 apache以及更早的http服务器主张的先例,保证优雅且唯一的url
@app.route ('/projects/' ) def projects (): return 'the project page' @app.route ('/about' ) def about (): return 'The about page'
虽然他们看起来相似,但是他们的结尾斜线的使用在url定义中不同,第一种情况中,执行projects的规范url尾端有一个斜线,就像文件系统中的文件夹,访问一个结尾不带斜线的url会被flask重定向到带斜线的规范url去
然而第二种情况的url结尾不带斜线,类似unix-like系统下的文件的路径名,访问结尾带斜线的url会产生一个404not found 错误.这行为使得忘记结尾斜线时,允许关联的url接任工作,与apache和其他的服务器的行为并无二异.此外,也保证了url的唯一,有助于避免搜索引擎索引同一个页面两次.
一随意,二只能访问url/about
flask构造url flask可以匹配url,那么flask也可以生成他们,可以使用url_for()来给指定的函数构造url,它接受函数名作为第一个参数,也接受对应url规则的变量本分的命名参数,未知变量部分会添加到url末尾作为查询参数
from flask import Flask,redirect,url_forapp = Flask (__name__) @app.route ('/admin' ) def helo_admin (): return 'Hello Admin' @app.route ('/guest/<guest>' ) def hell_guest (guest): return 'Hello %s as Guest' % guest @app.route ('/user/<name>' ) def hello_user (name): if name == 'admin' : return redirect (url_for ('helo_admin' )) else : return redirect (url_for ('hell_guest' ,guest= name)) if __name__ == '__main__' : app.run (debug= True)
上述脚本有一个函数hello_user(name),它接受来自url的参数的值.hello_user()函数检查接受的参数是否与admin匹配.如果匹配则使用url_for()将应用陈旭重定向到hello_admin()函数,否则重定向到将接受的参数作为guest参数传递给他的hello_guest()函数.
falskhttp方法 flask http方法.
方法
描述
GET
以未加密的形式将数据发送到服务器
HEAD
和GET方法相同,但是没有响应体
POST
用于将HTML表单数据发送到服务器.POST方法接受的数据不由服务器缓存
PUT
用上传的内容替换目标资源的所有当前表示
DELETE
删除由url给出的目标资源的所有当前表示
from flask import Flask,redirect,url_for,requestapp = Flask (__name__) @app.route ('/success/<name>' ) def success (name): return 'welcome %s ' %name @app.route ('/login' ,methods = ['POST' , 'GET' ]) def login (): if request.method == "POST" : user = request.form['nm' ] return redirect (url_for ('success' , name = user)) else : user = request.args.get ('nm' ) return redirect (url_for ('success' , name = user)) if __name__ == '__main__' : app.run (debug= True)
这里的 args是包含表单参数对及其对应值对的列表的字典对象,与’name’参数对应的值传递到/success.
falsk模板 在项目下创建templates文件夹,用于存放所有模板文件,并在目录下创建一个模板文件html文件hello.html
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8" > <title>Title</title> </head> <body> 我的模板html内容 </body> </html>
from flask import Flask, render_templateapp = Flask (__name__) @app.route ('/' ) def index (): return render_template ('hello.html' )
from flask import Flask, render_templateapp = Flask (__name__) @app.route ('/' ) def index (): my_str = "Hello World" my_int = 10 my_array = [3 , 4 , 2 , 1 , 7 , 9 ] my_dict = { 'name' : 'xiaoming' , 'age' : 18 } return render_template ('h1.html' , my_str=my_str, my_int=my_int, my_array=my_array, my_dict=my_dict) if __name__ == '__main__' : app.run (debug=True)
<!DOCTYPE html> <html lang="en" > <head> <meta charset="utf-8" > <title>Title</title> </head> <body> 我的模板html内容 <br />{{ my_str }} <br />{{ my_int }} <br />{{ my_array }} <br />{{ my_dict }} </body> </html>
falsk静态文件 from flask import Flask,render_templateapp = Flask (__name__) @app.route ('/' ) def index (): return render_template ('index.html' ) if __name__ == '__main__' : app.run (debug=True)
<html> <head> <script type="text/javascript" src = "{{ url_for('static', filename = 'hello.js') }}" ></script> </head> <body> <input type = "button" onclick="sayHello()" value="Say Hello" /> </body> </html>
function sayHello ( ) { alert ("Hello world" ) }
falsk request对象 来自客户端网页的数据作为全局请求对象发送到服务器,为了处理请求数据,应从flask模块导入
request对象的属性
from 是一个字典对象,包含表单参数及其值的键和值对
args 解析查询字符串的内容,他是问号之后的url的一部分
cookies 保存cookie名称和值的字典对象
files 与上传文件有关的数据
method 当前请求方法
falsk将表单数据发送到模板 from flask import Flask,render_template,requestapp = Flask (__name__) @app.route ('/' ) def student (): return render_template ('student.html' ) @app.route ('/result' ,methods = ['POST' , 'GET' ]) def result (): if request.method == 'POST' : result = request.form return render_template ("result.html" ,result = result) if __name__ == '__main__' : app.run (debug = True)
result.html
<!doctype html> <table border = 1 > {% for key, value in result.items () %} <tr> <th> {{ key }} </th> <td> {{ value }}</td> </tr> {% endfor %} </table>
student.html
<form action="http://localhost:5000/result" method="POST" > <p>Name <input type = "text" name = "Name" /></p> <p>Physics <input type = "text" name = "Physics" /></p> <p>Chemistry <input type = "text" name = "chemistry" /></p> <p>Maths <input type ="text" name = "Mathematics" /></p> <p><input type = "submit" value = "submit" /></p> </form>
falskcookies cookie以文本文件的形式存储在客户端的计算机上.request对象包含cookie的属性,他是所以cookie变量及其对应值的字典对象,客户端已传输,
设置cookie
设置cookie,默认有效期是临时cookie,浏览器关闭就失效,可以通过max_age设置有效期,单位是秒
resp = make_response ("success" ) resp.set_cookie ("w3" ,"s3" ,max_age=3600
获取cookie
获取cookie,通过request.cookies的方式,返回的是一个字典,可以获取字典里的响应的值
cookie_1 = request.cookies.get ('w3' )
删除cookie
这里的删除只是让cookie过期,并不是直接删除cookie,删除cookie,通过delete_cookie()的方式,里面是cookie的名字
resp = make_response ("del success" ) resp.delete_cookie ('w3' )
from flask import Flask,make_response,request app= Flask (__name__) @app.route ("/set_cookies" ) def set_cookie (): resp = make_response ("success" ) resp.set_cookie ("wa" ,'wa' ,max_age=3600 ) return resp @app.route ("/get_cookies" ) def get_cookie (): cookie_1 = request.cookies.get ("wa" ) return cookie_1 @app.route ("/delete_cookies" ) def delete_cookie (): resp = make_response ("del success" ) resp.delete_cookie ("wa" ) return resp if __name__ == '__main__' : app.run (debug=True)
flask会话 flask sessions(会话)
session对象也是一个字典对象,包含会话变量和关联值的键值对
Session['username' ] = 'admin'
释放会话变量,使用pop()方法
session.pop ('username' ,None)
from flask import render_templatefrom flask import make_responsefrom flask import Flask,session,redirect,url_for,escape,requestapp = Flask (__name__) app.secret_key = "wanan" @app.route ('/' ) def index (): if 'username' in session: username = session['username' ] return '登录用户名是:' + username + '<br>' + \ "<b><a href = '/logout'>点击这里注销</a></b>" return "您暂未登录,<br><a href = '/login'></b>" + \ "点击这里登录</b></a>" \ @app.route ('/login' ,methods = ['GET' ,'POST' ]) def login (): if request.method == "POST" : session['username' ] = request.form['username' ] return redirect (url_for ('index' )) return '' ' <form action = "" method = "POST"> <p><input type="text" name="username"/><p> <p><input type="submit" value="登录"/></p> </form> ' '' def logout (): session.pop ('username' ,None) return redirect (url_for ('index' )) if __name__ == '__main__' : app.run (debug=True)
flask重定向和错误 flask类有一个redirect()函数.调用时,它返回一个响应对象,并将用户重定向到具有指定状态代码的另一个位置
Flask.redirect (location,statuscode,response)
location 参数是应该重定向响应的url
statuscode 发送到浏览器标头,默认为302
response 参数用于实例化响应
默认状态码为302,表示’found’
from flask import Flask,redirect,url_for,render_template,request,abortapp = Flask (__name__) @app.route ('/' ) def index (): return render_template ('log_in.html' ) @app.route ('/login' ,methods = ['POST' ,'GET' ]) def login (): if request.method == "POST" : if request.form['username' ] == 'admin' : return redirect (url_for ('success' )) else : abort (401 ) else : return redirect (url_for (index)) @app.route ('/success' ) def success (): return 'logged in successfully' if __name__ == '__main__' : app.run (debug=True)
flask类具有带有错误代码的about()函数
flask消息闪现 flask提供了一个简单的方法来使用闪现系统像用户反馈信息,闪现系统使得在一个请求结束的时候记录一个信息,并且在下次(且仅在下一次中)请求时访问它,这通常与布局模板结合使用以公开信息
在flaskweb应用程序中生成这样的信息性消息很容易.flask框架的闪现系统可以在一个视图中创建信息,并在名为next的视图函数中呈现它.flask模块包含flash()方法.它将消息传递给下一个请求,该请求通过是一个模板
message 参数是要闪现的实际消息
cotegory 参数是可选的,它可以是 error info warning
为了从会话中删除消息,模板调用get_flashed_messages()
get_flashed_messages (with_categories,cotegory_filter)
from flask import Flask,flash,redirect,render_template,request,url_forapp = Flask (__name__) app.secret_key = 'random string' @app.route ('/' ) def index (): return render_template ('index.html' ) @app.route ('/login' ,methods = ['GET' ,'POST' ]) def login (): error = None if request.method == "POST" : if request.form['username' ] != 'admin' or request.form['password' ] != 'admin' : error = "Invalid username or password. Please try again!" else : flash ("You were successfully logged in" ) return redirect (url_for ('index' )) return render_template ('login.html' ,error = error) if __name__ == '__main__' : app.run (debug=True)
两个参数都是可选的,如果接收到的消息具有类别,则第一个参数是元组,第二个参数仅用于显示特定消息
{% with messages = get_flashed_messages () %} {% if messages %} {% for message in messages %} {{ message }}} {% endfor %} {% endfor %} {% endwith %}
flask文件上传 flask中处理文件上传非常简单,它需要一个html表单,其enctype属性设置为 “multipart/form-data”,将文件发布到url.url处理程序从 request.files[]对象中提取文件,并将其保存到所需位置.每个上传文件首先会保存在服务器上的临时位置,然后将其实际保存到他的最终位置,目标文件的名称可以是硬编码的,也可以从request.files[file]对象的filename属性中获取.但是,建议使用secure_filename()函数获取它的安全版本
可以在flask对象的配置设置中定义默认上传文件夹的路径和上传文件的最大大小.
app.config['UPLOAD_FOLDER' ] app.config['MAX_CONTENT_LENGTH' ]
upload.html
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8" > <title>File Upload</title> </head> <body> <form action="http://localhost:5000/uploader" method="post" enctype="multipart/form-data" > <input type="file" name="file" /> <input type="submit" name="提交" /> </form> </body> </html>
from flask import Flask,render_template,requestfrom werkzeug.utils import secure_filenameimport os app = Flask (__name__) app.config['UPLOAD_FOLDER' ] = 'upload/' @app.route ('/upload' ) def upload_file (): return render_template ('upload.html' ) @app.route ('/uploader' ,methods=['POST' ,'GET' ]) def uploader (): if request.method == "POST" : f = request.files['file' ] print (request.files) f.save (os.path.join (app.config['UPLOAD_FOLDER' ],secure_filename (f.filename))) return 'file uploaded successfully' else : return render_template ('upload.html' ) if __name__ == '__main__' : app.run ()
flask 扩展 from flask import Flaskfrom flask_foo import Foofoo = Foo () app = Flask (__name__) app.config.update ( Foo_BAR='baz' , FOO_SPAM='eggs' , ) foo.init_app (app)
flask邮件
参数
描述
MAIL_SERVER
电子邮件服务器的名称/IP地址
MAIL_PORT
使用的服务器的端口号
MAIL_USE_TLS
启用/禁用传输安全层加密
MAIL_USE_SSL
启用/禁用安全套接字层加密
MAIL_DEBUG
调试支持。默认值是Flask应用程序的调试状态
MAIL_USERNAME
发件人的用户名
MAIL_PASSWORD
发件人的密码
MAIL_DEFAULT_SENDER
设置默认发件人
MAIL_MAX_EMAILS
设置要发送的最大邮件数
MAIL_SUPPRESS_SEND
如果app.testing设置为true,则发送被抑制
MAIL_ASCII_ATTACHMENTS
如果设置为true,则附加的文件名将转换为ASCII
Mail类
flask-mail.Mail (app = None)
send() 发送Message类对象的内容
connect() 打开与邮件主机的连接
send_message() 发送消息对象
Message类
flask-mail.Message (subject,recipients,body,html,sender,cc,bcc,reply-to,date,charset,extra_headers,mail_options,rcpt_options)
attach() 为邮件添加附件,此方法采用一下参数
filename 要添加的文件的名称
content_type MIME类型的文件
data 原始文件内容
处置 内容处置(如果有的话)
add_recipient() 向邮件添加另一个收件人
from flask import Flaskfrom flask_mail import Mail, Messageapp = Flask (__name__) app.config['MAIL_SERVER' ] = 'smtp.qq.com' app.config['MAIL_PORT' ] = 465 app.config['MAIL_USERNAME' ] = '1498032121@qq.com' app.config['MAIL_PASSWORD' ] = '' app.config['MAIL_USE_TLS' ] = False app.config['MAIL_USE_SSL' ] = True mail = Mail (app) @app.route ("/" ) def index (): msg = Message ('Hello' ,sender='1498032121@qq.com' ,recipients= ['' ]) msg.body = "Hello Flask message sent from Flask_mail" mail.send (msg) return "Sent" if __name__ == '__main__' : app.run (debug=True)
falskwtf
标准表单字段
描述
TextField
表示<input type ='text'>
HTML表单元素
BooleanField
表示<input type ='checkbox'>
HTML表单元素
DecimalField
用于显示带小数的数字的文本字段
IntegerField
用于显示整数的文本字段
RadioField
表示<input type = 'radio'>
HTML表单元素
SelectField
表示选择表单元素
TextAreaField
表示<textarea>
HTML表单元素
PasswordField
表示<input type = 'password'>
HTML表单元素
SubmitField
表示<input type = 'submit'>
表单元素
文本字段的表单
from flask_wtf import Fromfrom wtforms import TextFieldclass ContactForm (Form ): name = TextFiled ("Name Of Student ")
除了name字段,还会自动创建SCRF令牌的隐藏字段,这是为了防止Cross Site Request Forgery(跨站请求伪造)攻击.渲染时这将导致等效的html脚本
<input id = "csrf_token" name="csrf_token" type="hidden" /> <label for ="name" >Name Of Student</label><br> <input id = "name" name="name" type="text" value="" />
falsk sqlite