Flask——路由,jinja2,三板斧,前端数据传输,反向解析,配置文件,转换器,路由本质,CBV

flask 项目

from flask import Flask,request


app=Flask(__name__)

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

if __name__ == '__main__':
    app.run()
    # 请求来了,会执行 app(request),会触发谁?触发__call__方法

2 登录,显示用户信息-小案例

from flask import Flask,render_template,request,redirect,session,url_for
app = Flask(__name__)

app.debug = True
app.secret_key = 'sdfsdfsdfsdf'

USERS = {
    1:{'name':'张三','age':18,'gender':'男','text':"道路千万条"},
    2:{'name':'李四','age':28,'gender':'男','text':"安全第一条"},
    3:{'name':'王五','age':18,'gender':'女','text':"行车不规范"},
}

@app.route('/detail/<int:nid>',methods=['GET'])
def detail(nid):
    user = session.get('user_info')
    if not user:
        return redirect('/login')

    info = USERS.get(nid)
    return render_template('detail.html',info=info)


@app.route('/index',methods=['GET'])
def index():
    user = session.get('user_info')
    if not user:
        # 反向解析
        url = url_for('l1')
        return redirect(url)
    return render_template('index.html',user_dict=USERS)


@app.route('/login',methods=['GET','POST'],endpoint='l1')
def login():
    if request.method == "GET":
        return render_template('login.html')
    else:
        # request.query_string
        user = request.form.get('user')
        pwd = request.form.get('pwd')
        if user == 'cxw' and pwd == '123':
            session['user_info'] = user
            return redirect('http://www.baidu.com')
        return render_template('login.html',error='用户名或密码错误')

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

jinja2 模板语法

        {% for k,v in user_dict.items() %}
        <tr>
            <td>{{k}}</td>
            <td>{{v.name}}</td>
            <td>{{v['name']}}</td>
            <td>{{v.get('name')}}</td>
            <td><a href="/detail/{{k}}">查看详细</a></td>{{error}}
        </tr>
        {% endfor %}
# 处理xss攻击
     1 模板层   要渲染的字符串|safe
     2 后端:Markup('<input type="text">')
     # Markup等价django的mark_safe ,
     # extends,include一模一样

三板斧

return 字符串
return render_template('detail.html',info=info)
return redirect('/login')

获取前端请求携带的数据

# get 请求
	  request.query_string
# post请求
      request.form.get('user')
# session
      session.get('user_info')
# 设置 session
      session['user_info'] = user

路由

路由写法(路径,支持的请求方式,别名)
@app.route('/login',methods=['GET','POST'],endpoint='l1')

分组(django中的有名分组)
@app.route('/detail/<int:nid>',methods=['GET'])

反向解析

url_for('别名')  # 后端

url = url_for('l1')
return redirect(url)

配置文件

# SECRET_KEY:如果使用session,必须配置
# SESSION_COOKIE_NAME:cookie名字
# 数据库地址,端口号,也要放到配置文件中,但是不是内置的参数

# flask内置session实现
     通过SECRET_KEY加密以后,当做cookie返回给浏览器
     下次发送请求,携带cookie过来,反解,再放到session中

方式一

app.config['DEBUG'] = True
PS: 由于Config对象本质上是字典,所以还可以使用		
app.config.update(...)

方式二

#通过py文件配置
app.config.from_pyfile("python文件名称")
如:
settings.py
DEBUG = True

方式三

app.config.from_object('settings.TestingConfig')

class Config(object):
    DEBUG = False
    TESTING = False
    DATABASE_URI = 'sqlite://:memory:'


class ProductionConfig(Config):
    DATABASE_URI = 'mysql://user@localhost/foo'


class DevelopmentConfig(Config):
    DEBUG = True


class TestingConfig(Config):
    TESTING = True

转换器

DEFAULT_CONVERTERS = {
    'default':          UnicodeConverter,
    'string':           UnicodeConverter,
    'any':              AnyConverter,
    'path':             PathConverter,
    'int':              IntegerConverter,
    'float':            FloatConverter,
    'uuid':             UUIDConverter,
}

路由的本质

1 本质就是:app.add_url_rule()
2 endpoint:如果不写默认是函数名,endpoint不能重名

app.add_url_rule参数

@app.route和app.add_url_rule参数:
rule, URL规则
view_func, 视图函数名称
defaults = None, 默认值, 当URL中无参数,defaults = {'k': 'v'} 为函数提供固定参数
endpoint = None, 名称,用于反向生成URL,即: url_for('名称')
methods = None, 允许的请求方式,如:["GET", "POST"]
#对URL最后的 / 符号是否严格要求,默认严格,False,就是不严格
strict_slashes = None
    '''
        @app.route('/index', strict_slashes=False)
        #访问http://www.xx.com/index/ 或http://www.xx.com/index均可
        @app.route('/index', strict_slashes=True)
        #仅访问http://www.xx.com/index
    '''
#重定向到指定地址
redirect_to = None, 
    '''
        @app.route('/index/<int:nid>', redirect_to='/home/<nid>')
    '''

CBV

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

app=Flask(__name__)


class IndexView(views.View):  # 必须重写 dispatch_request 方法
    methods = ['GET']
    decorators = [auth, ]
    def dispatch_request(self):
        return 'Index!'

def auth(func):
    def inner(*args, **kwargs):
        print('before')
        result = func(*args, **kwargs)
        print('after')
        return result
    return inner

class IndexView(views.MethodView):  # 不用重写 dispatch_request 方法
    methods = ['GET']  # 指定运行的请求方法
    decorators = [auth, ]  #加多个装饰器就是从上往下的效果
    
    def get(self):
        return "我是get请求"
    def post(self):
       return '我是post请求'

# 路由注册
app.add_url_rule('/index',view_func=IndexView.as_view('index'))

if __name__ == '__main__':
    app.run()
posted @ 2020-08-25 20:17  pythoner_wl  阅读(342)  评论(0编辑  收藏  举报