Fork me on GitHub

Flask的简单认识

Flask的简单认识

Flask是轻量级的框架,适用于简单的程序


与Django的比较:

Django: 无socket,中间件,路由,视图(CBV,FBV),模板,ORM, cookie,session,缓存,序列化,Form,信号.....

flask: 无socket,中间件(需要扩展),路由,视图(CBV,FBV),第三方模板(jinja2),cookie,session


Flask 的网络通信, 依赖于 werkzeug模块(实现了wsgi协议的模块 )

wsgi

web 服务网关接口协议

请求 -->> socket接听 -->> web应用

实现wsgi协议的模块
本质:创建socket监听请求和转发请求


Flask 的启动入口

wsgi.py

from werkzeug.wrappers import Request, Response

@Request.application
def hello(request):
return Response('Hello World!')

if name == 'main':
from werkzeug.serving import run_simple
run_simple('localhost', 4000, hello)

flask

from flask import Flask

实例化Flask对象

app = Flask(name)

生成路由关系,并把关系保存到 app.url_map

@app.route('/')
def hello_world():
return 'Hello World!'

if name == 'main':
app.run()

启动程序,监听用户请求

一旦请求到来,执行 app._ _call _ _方法

封装用户请求

进行路由匹配


>**Flask 的路由系统**

(1)装饰器与路由系统 捆绑到一起

常用

@app.route('/')
def hello_world():
return 'Hello World!'

(2) app.add_url_rule('/','hello_world',hello_world)

def hello_world():
return 'Hello World!'

app.add_url_rule('/','hello_world',hello_world)

( 3 ) 带参数的装饰器 -- flask 的路由系统

装饰器

有参数的装饰器, 形成闭包 把参数传给inner使用

@app.route('/')
def hello_world():
return 'Hello World!'

def route(self, rule, **options):
def decorator(f):
endpoint = options.pop('endpoint', None)
self.add_url_rule(rule, endpoint, f, **options)
return f
return decorator

无参数的装饰器

def wrapper(func):
def inner(args,**kwargs):
print('hello')
return func(
args,**kwargs)
return inner

@wrapper
def func(arg):
print(arg)


Flask 的 render_template

导入
from flask import render_template

指定模板文件夹
app = Flask(name,template_folder='templates',static_url_path='/static/',static_folder='static')

返回数据给模板
return render_template('login.html',msg=msg)


Flask 的 request

指定请求方式
@app.route('/login',method=['GET','POST'])
def login():
return render_template('login.html')

request的数据
print(request) #<Request 'http://127.0.0.1:5000/login' [POST]>
print(request.query_string)
print(request.args) # get 请求的参数
print(request.values) # 全部的请求参数 CombinedMultiDict([ImmutableMultiDict([('v', '123')]), ImmutableMultiDict([])])
print(request.form) # post 请求的参数


Flask 的 静态文件

配置 static文件目录,和 path

app = Flask(name,template_folder='templates',static_url_path='/static/',static_folder='static')

src
"{{ url_for('static',filename='1.png') }}"
"/static/1.png"


Flask 的 session -- secret key配置

session (所有的都放到浏览器) | django的session 是放在服务端
session_id -- cookie
放在浏览器,减轻服务端压力

app.config['SECRET_KEY'] = 'sadsada2321312' # 用serect_key 加盐加密

登录小 demo

from flask import Flask,render_template,request,session,redirect

app = Flask(name,template_folder='templates',static_url_path='/static/',static_folder='static')
app.config['SECRET_KEY'] = 'sadsada2321312'

@app.route('/',methods=['GET'])
def hello_world():
user = session.get('user','')
if user:
return 'Hello World!'
else:
return redirect('/login')

@app.route('/login',methods=['GET','POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
else:
user = request.values.get('user')
if user:
session['user'] = user
return redirect('/')
else:
msg = '用户名密码错误'
return render_template('login.html',msg=msg)

if name == 'main':
app.run()

posted @ 2018-03-09 17:43  派对动物  阅读(295)  评论(0)    收藏  举报
Top