flask

flask应用

from flask import Flask#导入flask模块
app = Flask(__name__)#flask类的一个对象是我们的wsgi应用程序
#flask构造函数使用当前模块(__name__)的名称作为参数

@app.route('/')#flask的route()函数是一个装饰器,它告诉应用程序那个url应该调用相关的函数
def hello_world():
return 'Hello world'

if __name__ == '__main__':
app.run()
app.route(rule,options)
  • 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方法的一个参数传入

app.run(debug=True)

flask变量规则

要给url添加变量部分,可以把这些特殊的字段标记为<variable_name>,这个部分将会作为命名参数传递到你的函数,规则可以用<converter:variable_name>指定一个可选的转换器.

@app.route('/user/<username>')
def show_user_profile(username):
#show the user profile for that user
return 'User %s' % username
@app.route('/post/<int:post_id>')
#show the post with the given id, the id is an integer
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_for
app = 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,request
app = 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_template

app = Flask(__name__)

@app.route('/')
def index():
return render_template('hello.html')
from flask import Flask, render_template

app = 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>

image-20220417155310265

falsk静态文件

from  flask import Flask,render_template
app = 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,request
app = 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变量及其对应值的字典对象,客户端已传输,

  1. 设置cookie

    设置cookie,默认有效期是临时cookie,浏览器关闭就失效,可以通过max_age设置有效期,单位是秒

    resp = make_response("success") #设置响应体
    resp.set_cookie("w3","s3",max_age=3600
  2. 获取cookie

    获取cookie,通过request.cookies的方式,返回的是一个字典,可以获取字典里的响应的值

    cookie_1 = request.cookies.get('w3')	
  3. 删除cookie

    这里的删除只是让cookie过期,并不是直接删除cookie,删除cookie,通过delete_cookie()的方式,里面是cookie的名字

    resp = make_response("del success") #设置响应体
    resp.delete_cookie('w3')
from flask import Flask,make_response,request #注意导入make_response
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") #获取名字为 对应的cookie的值
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_template
from flask import make_response
from flask import Flask,session,redirect,url_for,escape,request
app = 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():
# remove the username from the session if it is there
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,abort
app = 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.about(code)

flask消息闪现

flask提供了一个简单的方法来使用闪现系统像用户反馈信息,闪现系统使得在一个请求结束的时候记录一个信息,并且在下次(且仅在下一次中)请求时访问它,这通常与布局模板结合使用以公开信息

在flaskweb应用程序中生成这样的信息性消息很容易.flask框架的闪现系统可以在一个视图中创建信息,并在名为next的视图函数中呈现它.flask模块包含flash()方法.它将消息传递给下一个请求,该请求通过是一个模板

flash.(message,category)
  • 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_for

app = 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,request
from werkzeug.utils import secure_filename

import 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 Flask
from flask_foo import Foo
foo = Foo()

app = Flask(__name__)
app.config.update(
Foo_BAR='baz',
FOO_SPAM='eggs',
)
foo.init_app(app)

flask邮件

pip install Flask-Mail
参数 描述
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 Flask
from flask_mail import Mail, Message

app = 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

pip install flask-WTF
标准表单字段 描述
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 From
from wtforms import TextField

class 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