flask 基本使用

flask 简介

django是个大而全的框架,flask是一个轻量级的框架。

django内部为我们提供了非常多的组件:orm / session / cookie / admin / form / modelform / 路由 / 视图 / 模板 / 中间件 / 分页 / auth / contenttype / 缓存 / 信号 / 多数据库连接

flask框架本身没有太多的功能:路由/视图/模板(jinja2)/session/中间件 ,第三方组件非常齐全。
注意:django的请求处理是逐一封装和传递; flask的请求是利用上下文管理来实现的。

flask快速使用

安装

pip3 install flask

view

from flask import Flask

# 创建flask对象
app = Flask(__name__)

@app.route('/index')
def index():
    return 'hello world'


@app.route('/login')
def login():
    return 'login'

if __name__ == '__main__':
    app.run()

总结:

  • flask框架是基于werkzeug的wsgi实现,flask自己没有wsgi。
  • 用户请求一旦到来,就会之 app.__call__ 方法 。
  • 写flaks标准流程

flask路由

from flask import Flask

# 创建flask对象
app = Flask(__name__)

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

if __name__ == '__main__':
    app.run()

路由的参数(别名)

我访问 /index 得到 login

from flask import Flask,render_template,redirect,url_for

# 创建flask对象
app = Flask(__name__)

@app.route('/index')
def index():
    return redirect(url_for('login'))


@app.route('/login',methods=['GET','POST'],endpoint="login")
def login():
    return 'login'

if __name__ == '__main__':
    app.run()

动态路由

view

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

# 创建flask对象
app = Flask(__name__,template_folder='templates')#template_folder这个参数是控制模板文件夹的默认 templates 可以不写

@app.route('/index')
def index():
    return render_template('index.html')#先创建templates文件夹


# 获取?后面的值
@app.route('/edit1')
def edit1():  
    name=request.args.get('name')
    print(name)
    return 'ok'

#默认是字符串类型
@app.route('/edit2/<name>')
def edit2(name):  # 默认字符串类型
    print(name)
    return 'ok'

#默认是字符串类型
@app.route('/edit3/<int:nid>')
def edit3(nid):  # 默认字符串类型
    print(nid)
    return 'ok'

if __name__ == '__main__':
    app.run()

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>测试</h1>
<a href="/edit1?name=小强">编辑1</a>
<a href="/edit2/小强2">编辑2</a>
<a href="/edit3/3">编辑3</a>
</body>
</html>

获取提交的数据

from flask import request

@app.route('/index')
def login():
	request.args # GET形式传递的参数
	request.form # POST形式提交的参数

返回数据

@app.route('/index')
def login():
	return render_template('模板文件')
	return jsonify()#jsom
	reutrn redirect('/index/') # reutrn redirect(url_for('idx'))返回别名
	return "...."#返回值

模板处理

view

@app.route('/login',methods=['GET','POST'])
def login():
    error = '用户名或密码错误'
    # return render_template('login.html',**{'error':error})
    return render_template('login.html',error=error)

DATA_DICT = {
    1: {'name':'陈硕',"age":73},
    2: {'name':'汪洋',"age":84},
}

@app.route('/index',endpoint='idx')
@auth
def index():
    data_dict = DATA_DICT
    return render_template('index.html',data_dict=data_dict)

html

{{ error }}#传来什么就是什么

{% for key,value in data_dict.items() %}
    <tr>
        <td>{{key}}</td>
        <td>{{ value.name}}</td>
    </tr>
{% endfor %}

装饰器

import functools


def auth0(func):
    print(2)
    @functools.wraps(func)
    def inner(*args, **kwargs):
        return func(*args, **kwargs)
    print(22)
    return inner


def auth1(func):
    print('1')
    @functools.wraps(func)
    def inner(*args, **kwargs):
        return func(*args, **kwargs)
    print(11)
    return inner


@auth0
@auth1
def index():
    print('index')

打印结果
1
11
2
22    
#离他进的先执行·

保存用户会话信息session

装饰器验证

def auth(func):
    @functools.wraps(func)
    def inner(*args,**kwargs):
        username = session.get('xxx')
        if not username:
            return redirect(url_for('login'))
        return func(*args,**kwargs)
    return inner

添加session

app.secret_key = 'uo3kj9sd78ij3l4kj9sd87fj'#要设置这个 key 不然报错


@app.route('/login',methods=['GET','POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    user = request.form.get('user')
    pwd = request.form.get('pwd')
    if user == 'changxin' and pwd == "dsb":
        session['xxx'] = 'changxin'
        return redirect('/index')
    error = '用户名或密码错误'
    return render_template('login.html',error=error)# 相当于return render_template('login.html',**{'error':error})

被验证的加了装饰器的

@app.route('/del/<int:nid>')
@auth
def delete(nid):
    del DATA_DICT[nid]
    # return redirect('/index')
    return redirect(url_for("idx"))
  1. flask的session是保存在:加密的形式保存在浏览器的cookie上。
  2. 装饰器相关
    • 编写装饰器,记得加functools
    • 多个装饰器的应用
posted @ 2020-03-12 10:30  一起奥利给  阅读(595)  评论(0编辑  收藏  举报