Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。
默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask 支持用扩展来给应用添加这些功能,如同是 Flask 本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask 也许是“微小”的,但它已准备好在需求繁杂的生产环境中投入使用。
一.Flask框架的基本使用
from flask import Flask #静态文件和模板路径配置 app = Flask(__name__) #创建flask对象起个名字,__name__是当前py文件的名字 @app.route("/") #装饰个函数 def hello(): #返回字符串 return "你好西西" if __name__ == "__main__": #传ip和端口 app.run() #run启动
访问:http://127.0.0.1:5000/
返回:你好西西
二.路由系统
常用路由系统有五种
(1)@app.route('/user/<username>')
把username这个参数传递给函数
(2)@app.route('/post/<int:post_id>')
int:post_id只允许发整型赋值给post_id
(3)@app.route('/post/<float:post_id>')
(4)@app.route('/post/<path:path>')
path类型除换行以外的所有
(5)@app.route('/login', methods=['GET', 'POST'])
所有的路由系统都是基于以下对应关系来处理
DEFAULT_CONVERTERS = { 'default': UnicodeConverter, #字符串类型 'string': UnicodeConverter, #字符串类型 'any': AnyConverter, # 'path': PathConverter, # 'int': IntegerConverter, # 'float': FloatConverter, # 'uuid': UUIDConverter, }
三.模板
1.模板的使用:Flask使用的是Jinja2模板,所以其语法和Django无差别
视图函数:
from flask import Flask,render_template #导入render_template返回模版 #静态文件和模板路径配置 app = Flask(__name__) #创建flask对象起个名字,__name__是当前py文件的名字 @app.route("/") #装饰个函数 def hello(): #返回模版 return render_template('index.html',k1='root',k2=[1,2,3],k3={'name':'xixi','age':18}) #传值到index.html if __name__ == "__main__": #传ip和端口 app.run() #run启动
页面:index.html
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <!--字符串--> {{k1}} <!--列表--> {{k2}} <!--for循环列表--> <ul> {% for item in k2 %} <li>{{item}}</li> {%endfor%} </ul> <!--字典--> {{k3}} <!--for循环字典--> <ul> {% for k,v in k3.items() %} <li>{{k}}-{{v}}</li> {%endfor%} </ul> </body> </html>
访问:http://127.0.0.1:5000/
返回:
root [1, 2, 3]
1
2
3
{'age': 18, 'name': 'xixi'}
age-18
name-xixi
2.自定义模板方法:Flask中自定义模板方法的方式和Bottle相似,创建一个函数并通过参数的形式传入render_template
视图函数:
from flask import Flask,render_template #导入render_template返回模版 #静态文件和模板路径配置 app = Flask(__name__) #创建flask对象起个名字,__name__是当前py文件的名字 #自定制函数 def xixi(): return "<a>西西</a>" @app.route("/") #装饰个函数 def hello(): #返回模版 return render_template('index.html',k1=xixi) #把xixi这个函数当作参数传递到前端index.html if __name__ == "__main__": #传ip和端口 app.run() #run启动
页面:index.html
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <!--接收自定制函数--> {{k1()|safe}} </body> </html>
访问:http://127.0.0.1:5000/
返回:西西
四、公共组件
1.获取用户请求数据
对于Http请求,Flask会讲请求信息封装在request中(werkzeug.wrappers.BaseRequest),提供的如下常用方法和字段以供使用:
(1)request.method
(2)request.args:GET发过来的请求数据
(3)request.form
(4)request.values
(5)request.files
(6)request.cookies:获取cookies
(7)request.headers:获取请求头
(8)request.path
(9)request.full_path
(10)request.script_root
(11)request.url
(12)request.base_url
(13)request.url_root
(14)request.host_url
(15)request.host
2.响应数据
当用户请求被开发人员的逻辑处理完成之后,会将结果发送给用户浏览器,那么就需要对请求做出相应的响应。
(1)字符串
(2)模板引擎
(3)重定向
(4)错误页面
(5)设置相应信息
3.Session
除请求对象之外,还有一个 session 对象。它允许你在不同请求间存储特定用户的信息。它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使用会话,你需要设置一个密钥。
4.message
<1>前端页面:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> {% with messages = get_flashed_messages() %} {% if messages %} <ul class="flashes"> {% for message in messages %} <li>{{ message }}</li> {% endfor %} </ul> {% endif %} {% endwith %} </body> </html>
<2>视图函数:
from flask import Flask, flash, redirect, render_template, request #导入flash app = Flask(__name__) app.secret_key = 'some_secret' @app.route('/') def index1(): return render_template('index.html') #前端页面,把message里的值传到前端 @app.route('/set') def index2(): v = request.args.get('p') #通过get获取到值,写个p设置一次 #通过flash设置值,往message里写值 flash(v) return 'ok' if __name__ == "__main__": app.run()
第一次访问:http://127.0.0.1:5000/没有值
第二次访问:http://127.0.0.1:5000/set?p=123
返回:ok
第三次访问:http://127.0.0.1:5000/set?p=456
返回:ok
第四次访问:http://127.0.0.1:5000/
返回:
123
456
5.自定制中间件:在wsgi_app()方法前自定制操作
from flask import Flask,render_template,request,make_response,redirect,url_for,session app = Flask(__name__) @app.route("/index/",methods=['GET','POST']) def hello(): print('...') return 'OK' def my_wsgi_app(environ, start_response): print('my_wsgi_app') start_response('200 OK', [('Content-Type', 'text/html')]) return [bytes('<h1>Hello</h1>', encoding='utf-8'), ] class Foo: def __init__(self,w): #接收app.wsgi_app self.w = w #封装到w里 def __call__(self, environ, start_response): #请求执行执行自定制__call__方法 #之前可以做任意行为 obj = self.w(environ, start_response) #之后可以做任意行为 return obj if __name__ == "__main__": #自定制中间件 app.wsgi_app = Foo(app.wsgi_app) #把app.wsgi_app传到Foo类 app.run()
浙公网安备 33010602011771号