flask框架安装

flask框架安装

pip install flask --user

1.0程序的基本架构

1.1初始化

所有Flask程序都必须新建一个程序实例。WEB服务器把接收的客户端所有请求转交给这个对象处理。

# 如何初始化Flask对象实例
from flask import Flask
app = Flask(__name__)
# __name__参数决定程序根目录,以便能够找到向对于于根目录的资源文件位置。
1.2路由和视图函数

Flask实例需要知道URL和函数之间的关系,Flask保存了一个函数映射表称之为路由。

@app.route('/')
def index():
	return "Hello_World"

在这个过程中,index()就是视图函数,视图函数里可以返回html或者复杂的表单。

@app.route('/<name>')
def user(name): # 这里参数千万不能丢了
	return "Hello,%s" % (name)
1.3开启服务器

Flask实例run方法来启动服务器。

if __name__=="__main__":
	# 添加__name__=="__main__",当前脚本被导入的时候不会当作一个新的服务器开启。
	app.run()

2.0请求-响应循环

请求对象request

from flask import request
2.1 程序和请求上下文
g程序上下文当前激活程序的程序实例
request程序上下文处理请求时用作临时存储的对象。每次请求都会重设这个变量
session程序上下文请求对象,封装了客户端发出的 HTTP 请求中的内容
current_app程序上下文用户会话,用于存储请求之间需要“记住”的值的词典
@app.route('/')
def index():
	bro = request.headers.get('User-Agent')
	return bro
# 从request对象中获取headers,再获取其中的User-agent项
2.2请求调度

程序生成客户端发来的请求,要找到该请求的视图函数。为了完成这个任务,Flask会在程序的URL映射中查找请求的URL随后找到相对应的视图函数。
映射关系可以通过@app.route或者app.add_url_rule()来添加
映射关系可以通过app.url_map来查看

2.3 请求钩子

通过装饰器为一个模块添加请求钩子, 对当前模块的请求进行额外的处理. 比如权限验证.

2.4响应
2.4.1自定义返回状态码

一般的情况下我们的程序会对http请求返回一个200状态码代表这个请求已经处理成功,这里演示一下如何自定义返回状态码。

@app.route('/')
def index():
	return "Hello",400
2.4.2设置Cookie
from flask import make_response
@app.route('/')
def index():
	response = make_response("<h1>WEB</h1>")
	response.set_cookie('Haozhan',"19")
	return response
2.4.3重定向
from flask import redirect
@app.route('/')
def index():
	return redirect("http://www.baidu.com")
2.4.4abort

一种特殊的响应由 abort 函数生成,用于处理错误。

@app.route('/')
def index():
	abort(404)

3.0模板

3.1JinJa2模板引擎

首先,你需要在脚本目录下新建一个文件夹,名字为:templates。
下面是在templates文件夹里新建的index.html内容

<h1>Hello,World</h1>

下面是在脚本目录下新建的main.py文件内容

from flask import Flask
from flask import render_template
app = Flask(__name__)

@app.route('/')
def index():
    return render_template("index.html")

if __name__=="__main__":
    app.run(debug=True)
3.1.1渲染模板
<h1>Hello,{{ name }}</h1>

上面是传入参数的index.html
下面是main.py文件的内容

@app.route('/<name>')
def index(name):
    return render_template("index.html",name=name)
3.1.2变量

3.1.1例子中使用的{{ name }}实际上是一个占位符,告诉模板需要获取数据的时候从服务器获取。占位符可以识别所有类型的变量。

<p>A value from a dictionary: {{ mydict['key'] }}.</p>
<p>A value from a list: {{ mylist[3] }}.</p>
<p>A value from a list, with a variable index: {{ mylist[myintvar] }}.</p>
<p>A value from an object's method: {{ myobj.somemethod() }}.</p>
3.1.2.1过滤器
{{ name| safe }}

| safe | 渲染值时不转义 |
| capitalize | 把值的首字母转换成大写,其他字母转换成小写|
| lower | 把值转换成小写形式|
| upper | 把值转换成大写形式|
| title | 把值中每个单词的首字母都转换成大写|
| trim | 把值的首尾空格去掉|
| striptags | 渲染之前把值中所有的 HTML 标签都删掉|
_提示,在不信任的用户输入地方。千万不要使用safe进行渲染。不然会解析元素造成安全隐患。

3.1.3控制结构
3.1.3.1模板IF
{% if name %}
    {{ name }}
{% else %}
    Hello World.
{% endif %}
# TYPE A
@app.route('/')
def index():
    name = None
    return render_template("index.html")
# TYPE B
@app.route('/')
def index():
    name = [1,2,3,5]
    return render_template("index.html",name=name)

我们来比较一下TYPEA和TYPEB有何不同,A未传入name的值,而B在name的位置传入的一个数组。将值传入{% if name %}后,A会执{% else %}里的数据,而B则会执行{% else %}之前的数据。这便是不同之处。

3.1.3.2模板for
@app.route('/')
def index():
    name = [1,2,3,5]
    return render_template("index.html",name=name)
{% for i in name %}
	<li>{{ i }}</li>
{% endfor %}
  • 下面的例子作为扩展,可以向主页传递消息 -
from flask import flash
@app.route('/')
def index():
    name = None
    flash("Hello")
    return render_template("index.html")
{% for msg in get_flashed_messages() %}
    {{ msg }}
{% endfor %}
3.1.3.3宏

宏的作用就类似于Python中的函数,使用关键字macro进行定义,可传入参数。

{% macro input(name,age=18) %}   # 参数age的默认值为18
 
 <input type='text' name="{{ name }}" value="{{ age }}" >
 
{% endmacro %}

调用

{{ input("haozhan",19) }}

除了直接调用,你还可以把宏存入文件中在使用时调用,例如这样。

{% include "news.html" %}

另一种强大的功能则是类似于Python中的类继承

<html>
<head>
{ % block head % }
<title>{ % block title % }{ % endblock % } - My Application</title>
{ % endblock % }
</head>
<body>
{ % block body % }
{ % endblock % }
</body>
</html>

我们首先创建一个实例,再以继承这个实例的基础上创建另一个实例。

{% extends "new.html" %}
{% block title %}Index{% endblock %}
{% block head %}
{{ super() }}
<style>
</style>
{% endblock %}
{% block body %}
<h1>Hello, World!</h1>
{% endblock %}

因为原来的{% block head %}里面不是空的,所以在子模板中要使用{{ super() }}获取原来的内容。

3.2使用 Flask-Bootstrap 集成 Twitter Bootstrap

Bootstrap 是客户端框架,因此不会直接涉及服务器。服务器需要做的只是提供引用了
Bootstrap 层 叠 样 式 表(CSS) 和 JavaScript 文 件 的 HTML 响 应, 并 在 HTML、CSS 和
JavaScript 代码中实例化所需组件。这些操作最理想的执行场所就是模板。

pip install flask-bootstrap # 安装bootstrap

导入bootstrap并完成初始化

from flask_bootstrap import Bootstrap
app = Flask(__name__)
bootstrap = Bootstrap(app)

模板导入bootstrap/base.html

{% extends "bootstrap/base.html" %}
{% block navbar %}
<div class="navbar navbar-inverse" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle"
data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">Flasky</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/">Home</a></li>
</ul>
</div>
</div>
</div>
{% endblock %}
{% block content %}
<div class="container">
<div class="page-header">
<h1>Hello, {{ name }}!</h1>
</div>
</div>
{% endblock %}
3.3自定义错误页面

像常规路由一样,Flask 允许程序使用基于模板的自定义错误页面。

@app.errorhandler(404)
def error404(e):
    return "这里啥都没有哦",404

和视图函数一样,错误处理函数也会返回响应和与之匹配的状态码。错误处理函数需要使用@errorhandler来注册,需要在函数中传入一个值.

3.4链接
url_for() # 该函数主要用于辅助知道url
3.5静态文件

当我们需要使用到静态文件的时候,我们在程序根目录下建立一个目录static。在那之后我们需要将使用到的静态资源放入static中,在程序中可以直接引用。

<img src="/static/1.jpg" />

4.0表单

4.1跨展请求伪造保护

默认情况下,Flask-wtf能保护所有表单免首CSRF攻击。

app.config['SECRET_KEY'] = 'hard guess string'
    • 通常为了增强安全性,密钥不应该被直接写入代码中,而应该被写入环境变量中。
4.2表单类

在使用Flask-wtf时,每个WEB表单都由一个继承自Form的类表示

from flask_wtf import From
from wtforms import StringField
from wtforms.validators import Required

class NameFrom(From):
	name = StringField("What is your name?",validators=[Required()])
	submit = SubmitField('Submit')

WTForms支持的HTML标准字段

  • StringField 文本字段
  • TextAreaField 多行文本字段
  • PasswordField 密码文本字段
  • HiddenField 隐藏文本字段
  • DateField 文本字段,值为 datetime.date 格式
  • DateTimeField 文本字段,值为 datetime.datetime 格式
  • IntegerField 文本字段,值为整数
  • DecimalField 文本字段,值为 decim函数al.Decimal
  • FloatField 文本字段,值为浮点数
  • BooleanField 复选框,值为 True 和 False
  • RadioField 一组单选框
  • SelectField 下拉列表
  • SelectMultipleField 下拉列表,可选择多个值
  • FileField 文件上传字段
  • SubmitField 表单提交按钮
  • FormField 把表单作为字段嵌入另一个表单
  • FieldList 一组指定类型的字段

WTForms验证函数

  • Email 验证电子邮件地址
  • EqualTo 比较两个字段的值;常用于要求输入两次密码进行确认的情况
  • IPAddress 验证 IPv4 网络地址
  • Length 验证输入字符串的长度
  • NumberRange 验证输入的值在数字范围内
  • Optional 无输入值时跳过其他验证函数
  • Required 确保字段中有数据
  • Regexp 使用正则表达式验证输入值
  • URL 验证 URL
  • AnyOf 确保输入值在可选值列表中
  • NoneOf 确保输入值不在可选值列表中

#### 4.3把表单渲染成HTML
我们可以通过参数form将对象NameForm传入模板

<form method="POST">
{{ form.hidden_tag() }}
{{ form.name.label }}
{{ form.name() }}
{{ form.submit() }}
</form>

当前我们已经使用HTML渲染出来了。如果对外观不满意,我们还可以传入参数来优化HTML属性。例如传入一个id

<form method="POST">
{{ form.hidden_tag() }}
{{ form.name.label }}
{{ form.name(id='my-text-field') }}
{{ form.submit() }}
</form>

我们也可以快速渲染,直接使用bootstrap中的样式来

{% import "bootstrap/wtf.html" as wtf %}
{{ wtf.quick_form(form) }}
4.4在视图函数中处理表单

python脚本的视图函数不仅要渲染表单,还得接收表单中的数据。

@app.route('/',methods=['GET','POST'])
def index():
	name = None
	# 设置一个空的name
	form = NameForm()
	# 实例化对象
	if form.validate_on_submit(): # 如果用户提交数据了就返回True,否则False
		name = form.name.data
		# name 等于form.name的data
		form.name.data = ''
		# 清空form.name.data
	return render_template('index.html',form=form,name=name)
	# 返回渲染html
4.5重定向和用户会话

刷新网页的情况下会出现警告,POST请求的数据可能会丢失。程序可以把数据存储在用户会话中,在请求之间记住这些数据。用户会话’session’

@app.route('/',methods=['POST','GET'])
def index():
    name = 'haozhan'
    form = NameForm()
    if form.validate_on_submit():
        session['name'] = form.name.data
        return redirect(url_for('index'))
   	render_template("index.html",name=session.get('name'),form=form)
4.6flash消息
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}
    if (session['name']=="admin"):
        flash('禁止')
  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值