前言:

框架的对比

Django:1个重武器,包含了web开发中常用的功能、组件的框架;(ORM、Session、Form、Admin、分页、中间件、信号、缓存、ContenType....);

  Tornado:2大特性就是异步非阻塞、原生支持WebSocket协议;

  Flask:封装功能不及Django完善,性能不及Tornado,但是Flask的第三方开源组件比丰富;http://flask.pocoo.org/extensions/

  Bottle:比较简单;

总结:

  不论优劣,不同的工具而已;

  小型web应用设计的功能点不多使用Flask;

  大型web应用设计的功能点比较多使用的组件也会比较多,使用Django(自带功能多不用去找插件);

  如果追求性能可以考虑Tornado;

Flask的socket是基于Werkzeug 实现的,模板语言依赖jinja2模板,在使用Flask之前需要安装一下;

pip3 install flask #安装flask

Flask简单使用

from flask import Flask,response

app=Flask(__name__) #创建1个Flask实例

@app.route('/')      #路由系统生成 视图对应url,
def first_flask(): #视图函数
return 'Hello World' #response if __name__ == '__main__':
app.run() #启动socket

一、flask的配置文件

app=Flask(__name__,template_folder='templates',static_url_path='/static/',static_path='/lizhiqiang')
#模板路径: template_folder='templates' #静态文件路径:static_url_path='/static/' #静态文件引入别名:static_path='/zhanggen' #设置为调试环境:app.debug=True (代码修改自动更新) #设置json编码格式 如果为False 就不使用ascii编码:app.config['JSON_AS_ASCII']=False #设置响应头信息Content-Type app.config['JSONIFY_MIMETYPE'] ="application/json;charset=utf-8" (注意 ;charset=utf-8)

二、路由系统

1.动态路由(url传参)

@app.route('/user/<name>')

from flask import Flask

app=Flask(__name__)

@app.route('/<name>')  #设置url传参数 http://127.0.0.1:5000/zhanggen
def first_flask(name): #视图必须有对应接收参数
print(name)
return 'Hello World' #response if __name__ == '__main__':
app.run() 接收字符串类型参数

@app.route('/post/<int:age>')

#接收整型数字参数
app=Flask(__name__)
@app.route('/<int:age>/') #设置url传参数 http://127.0.0.1:5000/18/
def first_flask(age): #视图必须有对应接收参数
print(age)
return 'Hello World' #response if __name__ == '__main__':
app.run() 接收整型数字参数

2、指定允许的请求方法

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

# 指定允许的请求方法
app=Flask(__name__)
@app.route('/<path:url>/',methods=['get']) #只允许get请求
def first_flask(url):
print(url)
return 'Hello World' #response if __name__ == '__main__':
app.run() 指定允许的请求方法

3、通过别名反向生成url

#反向生成url
from flask import Flask,url_for
app=Flask(__name__)
@app.route('/<path:url>',endpoint='name1')
def first_flask(url):
print(url_for('name1',url=url)) #如果设置了url参数,url_for(别名,加参数)
return 'Hello World' if __name__ == '__main__':
app.run() url_for()反向生成url

4、扩展路由功能:正则匹配url

from flask import Flask, views, url_for
from werkzeug.routing import BaseConverter app = Flask(import_name=__name__) class RegexConverter(BaseConverter):
"""
自定义URL匹配正则表达式
"""
def __init__(self, map, regex):
super(RegexConverter, self).__init__(map)
self.regex = regex def to_python(self, value):
"""
路由匹配时,匹配成功后传递给视图函数中参数的值
:param value:
:return:
"""
return int(value) def to_url(self, value):
"""
使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
:param value:
:return:
"""
val = super(RegexConverter, self).to_url(value)
return val # 添加到flask中
app.url_map.converters['regex'] = RegexConverter @app.route('/index/<regex("\d+"):nid>')
def index(nid):
print(url_for('index', nid=''))
return 'Index' if __name__ == '__main__':
app.run()

三、视图

1、给Flask视图函数加装饰器

注意如果要给视图函数加装饰器增加新功能,一点要加在路由装饰器下面,才会被路由装饰器装饰,才能生生成url关系;

#给Flask视图加装饰器
#1、定义1个装饰器 def auth(func):
print('我在上面')
def inner(*args,**kwargs):
return func(*args,**kwargs)
return inner app=Flask(__name__) @app.route('/',methods=['GET'])
@auth #注意如果要给视图函数加装饰器,一点要加在路由装饰器下面,才会被路由装饰器装饰
def first_flask():
print('ffff')
return 'Hello World' if __name__ == '__main__':
app.run()
#给Flask视图加装饰器
#1、定义1个装饰器 def auth(func):
print('我在上面')
def inner(*args,**kwargs):
return func(*args,**kwargs)
return inner app=Flask(__name__) @app.route('/',methods=['GET'])
@auth #注意如果要给视图函数加装饰器,一点要加在路由装饰器下面,才会被路由装饰器装饰
def first_flask():
print('ffff')
return 'Hello World' if __name__ == '__main__':
app.run()

2、request和response

 a.请求相关信息

request.method: 获取请求方法

request.json

request.json.get("json_key"):获取json数据 **较常用

request.argsget('name') :获取get请求参数

request.form.get('name') :获取POST请求参数

request.form.getlist('name_list'):获取POST请求参数列表(多个)

request.values.get('age') :获取GET和POST请求携带的所有参数(GET/POST通用)

request.cookies.get('name'):获取cookies信息

request.headers.get('Host'):获取请求头相关信息

request.path:获取用户访问的url地址,例如(/,/login/,/ index/);

request.full_path:获取用户访问的完整url地址+参数 例如(/login/?age=18)

request.script_root: 抱歉,暂未理解其含义;

request.url:获取访问url地址,例如http://127.0.0.1:5000/?age=18;

request.base_url:获取访问url地址,例如 http://127.0.0.1:5000/;

request.url_root

request.host_url

request.host:获取主机地址

request.files:获取用户上传的文件

obj = request.files['the_file_name']

obj.save('/var/www/uploads/' + secure_filename(f.filename))  直接保存

 

 b、响应相关信息

return "字符串" :响应字符串

return render_template('html模板路径',**{}):响应模板

return redirect('/index.html'):跳转页面

3 、Flask之CBV视图

#CBV视图
from flask import Flask,url_for,views
#-----------------------------------------------------
app=Flask(__name__) #装饰器 def auth(func):
print('我在上面')
def inner(*args,**kwargs):
return func(*args,**kwargs)
return inner
#--------------------------------------------------------
class IndexView(views.MethodView): #CBV视图
methods=['GET'] #允许的http请求方法(改CBV只允许GET方法)
decorators = [auth,] #每次请求过来都加auth装饰器 def get(self):
return 'Index.GET'
def post(self):
return 'Index.POST' app.add_url_rule('/index/',view_func=IndexView.as_view(name='name1')) #(name='name1'反向生成url别名 if __name__ == '__main__':
app.run()

五、模板语言

Flask使用的是Jinja2模板,所以其语法和Django无差别(Django的模板语言参考Jinja2)

1.引用静态文件

方式1:别名引入

<link rel="stylesheet" href="/zhanggen/commons.css">

方式2:url_for()方法引入

<link rel="stylesheet" href="{{  url_for('static',filename='commons.css')  }}">

2.模板语言引用上下文对象

变量

<h1>{{user_list}}</h1> <!--变量 -->
<h1>{{user_list}}</h1> <!--变量 -->

循环、索引取值

<ul>
{% for user in user_list %} <!--循环 -->
<li>{{user}}</li>
{% endfor %}

{{user_list.0}} <!-- 索引取值-->

</ul>

<ul>
{% for user in user_list %} <!--循环 -->
<li>{{user}}</li>
{% endfor %} {{user_list.0}} <!-- 索引取值--> </ul>

Flask的Jinjia2可以通过Context 把视图中的函数传递把模板语言中执行,这就是Django中的simple_tag和simple_fifter;

simple_tag(只能传2个参数,支持for、if)

@app.template_global()   #simple_tag
def foo(arg):
return '<input type="text">'
@app.template_global()   #simple_tag
def foo(arg):
return '<input type="text">'
<h1>{{foo(1)|safe}}</h1>                   <!--Flask的模板语言支持simple_tag-->
<h1>{{foo(1)|safe}}</h1>                   <!--Flask的模板语言支持simple_tag-->

3.wtform(flask表单验证插件)

3.1. 安装

pip install wtforms  #安装wtfroms插件

3.2登录注册

from flask import Flask,render_template,request
from wtforms import Form
from wtforms.fields import simple,core
from wtforms import validators app = Flask(__name__) #登录
class LoginFrom(Form):
username = simple.StringField(
label='用户名',
validators=[
validators.DataRequired(message='用户名不能是空'),
validators.Length(min=3,max=16,message='用户名必须大于%(min)d且小于%(max)d') ],
)
password = simple.PasswordField(
label='密码',
validators=[
validators.DataRequired(message='密码不能是空'),
validators.Length(min=3, max=16, message='密码必须大于%(min)d且小于%(max)d') ],
) @app.route('/',methods=['GET','POST'])
def login():
if request.method == 'GET':
fm = LoginFrom()
return render_template('login.html',wtf=fm)
else:
form = LoginFrom(formdata=request.form)
if form.validate():
return "ok" else:
return render_template('login.html',wtf=form) #注册
class RegForm(Form):
username=simple.StringField(
label='用户名',
validators=[
validators.DataRequired(message='用户名不能为空'),
validators.Length(min=3,max=16,message='用户名必须大于%(min)d且小于%(max)d'),
]
)
password = simple.PasswordField(
label='密码',
validators=[
validators.DataRequired(message='密码不能是空'),
validators.Length(min=3, max=16, message='密码必须大于%(min)d且小于%(max)d'),
validators.Email(message='密码必须符合邮箱规则')
],
)
repassword= simple.PasswordField(
label='确认密码',
validators=[validators.EqualTo(fieldname='password',message='密码不一致')]
)
gender=core.SelectMultipleField(
label="爱好",
validators=[validators.Length(min=2, max=4, message="癖好有问题")],
coerce=int,
choices=(
(1, "fengjie"),
(2, "luoyufeng"),
(3, "lixueqin"),
(4, "wuyifan"),
(5, "panta")
),
default=(1, 3, 5)
) @app.route('/reg',methods=["GET","POST"])
def reg():
if request.method == "GET":
fm = LoginFrom()
return render_template("reg.html",rf=fm)
else:
form = LoginFrom(request.data)
if form.validate():
return form.data.get("password")
else:
return render_template("reg.html", rf=form) if __name__ == '__main__':
app.run(debug=True)

html

#login.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<form action="" method="post" novalidate>
{{ wtf.username.label }}
{{ wtf.username }}
<p><h1>{{wtf.username.errors.0}}</h1></p>
<p>
{{ wtf.password.label }}
{{ wtf.password }}
</p>
<p><h1>{{wtf.password.errors.0}}</h1></p>
<input type="submit" value="登录">
</form>
</body>
</html> #reg.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<form action="" method="post" novalidate>
{% for field in rf %}
<p>{{ field.label }}{{ field }}{{ field.errors.0 }}</p>
{% endfor %}
<input type="submit" value="注册">
</form>
</body>
</html>

3.33.2.wtforms源码 猜想....

源码给你们一个链接吧,头疼

https://www.cnblogs.com/sss4/p/8097653.html

未完待续。。。

flask综合整理1的更多相关文章

  1. flask综合整理2

    session功能 首先我们知道session可以理解是一把钥匙,它存在在服务器上,其实在flask中也有session 1.系统自带的session from flask import sessio ...

  2. python基础===flask使用整理(转)

    flask 使用的一些整理 资源 Flask 文档|英文| expore flask| 快速教材| flask-admin| Flask-DebugToolbar| Flask-Login| Flas ...

  3. Flask框架整理

    Flask基础部分 Flask目录结构(蓝图) views中存放蓝图,每个蓝图也可以有自己的模板,用蓝图对不同功能的视图函数进行隔离,类似于django中的app pro_flask包的init.py ...

  4. flask综合案例

    一.项目准备 1.新建项目目录students,并创建虚拟环境 mkvirtualenv students 2.安装依赖环境 pip install flask==0.12.4 pip install ...

  5. Flask框架整理及配置文件

    阅读目录 Flask目录结构(蓝图) pro_flask包的init.py文件, 用于注册所有的蓝图 manage.py文件,作为整个项目的启动文件 views包中的blog.py,必须要通过sess ...

  6. 性能优化 | JVM与性能优化知识点综合整理

    JVM JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器.它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序. java编译 ...

  7. Spring Cloud Consul综合整理

    该项目通过自动配置和Spring环境以及其他Spring编程模型习惯用法提供了Spring Boot应用程序的Consul集成. 通过一些简单的注释,您可以快速启用和配置应用程序内的通用模式,并使用基 ...

  8. [js]事件综合 整理

    原文链接:http://www.cnblogs.com/xxcanghai/p/5205998.html 事件流:页面接收事件的顺序,IE提出了事件冒泡流,Netscape提出了事件捕获流. 事件冒泡 ...

  9. 常见问题2:html+css效果综合整理

    1.---文本框提示文字颜色--placeholder属性 <input type="text" placeholder="请输入提示文字" /> ...

随机推荐

  1. (转)【推荐】使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享

    原文地址:http://www.cnblogs.com/huyong/p/3334848.html 在开始讲解之前,我们先来看一下什么是Jquery EasyUI?jQuery EasyUI是一组基于 ...

  2. 解决Eclipse+ADT连接夜神模拟器失败问题

    问题1: 运行夜神模拟器,cmd执行 adb devices不显示 答案1: 原因可能是夜神模拟器的adb版本与sdk下的adb版本不一致,拷贝sdk下的adb.exe并改名为nox_adb.exe替 ...

  3. TypedValue.applyDimension的使用

    TypedValue.applyDimension是一个将各种单位的值转换为像素的方法 用法TypedValue.applyDimension(int unit, float value,Displa ...

  4. XE下的FMX中压缩图片

    用FMX压缩图片,发现FMX里的canvas没有draw,stretch,cliprect类,FMX里程序创建时会自动引用FMX.Graphics, 而这个单元内的TBitmap类的Canvas没有S ...

  5. TriggerAction扩展----ExInvokeCommandAction

    Wp&Win8中使用命令绑定时,除了Button控件自带命令绑定,其他的时候是用Interactivity库中的InvokeCommandAction实现的(Win8 需要额外安装第三方NuG ...

  6. ajax 判断账户密码 调取数据模糊查询 时钟

    一.判断账户密码 <Login.html> <head> <meta http-equiv="Content-Type" content=" ...

  7. SQL server T-SQL存储过程

    简介 存储过程是由一些SQL语句和控制语句组成的被封装起来的过程,它驻留在数据库中,可以被客户应用程序调用,也可以从另一个过程或触发器调用.它的参数可以被传递和返回.与应用程序中的函数过程类似,存储过 ...

  8. 一、SpringBoot是什么?

    SpringBoot是什么? 我管她是什么,好用就行了啊!!!但是无奈我的简历上写了“精通SpringBoot”...那总得大体说得上SpringBoot是个啥东西吧! Spring相信大家都用过,那 ...

  9. 结对作业-WordCount进阶版

    1.在文章开头给出博客作业要求地址. 博客园地址:https://www.cnblogs.com/happyzm/p/9559372.html 2.给出结对小伙伴的学号.博客地址,结对项目的码云地址. ...

  10. 630. Course Schedule III

    There are n different online courses numbered from 1 to n. Each course has some duration(course leng ...