• 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()
    
  • 相关阅读:
    一句话命令修改大小写
    SpringBoot打成jar包后无法读取resources资源文件里文件路径的问题 cannot be resolved to absolute file path because it does
    java路径两种写法"/"和"\"
    java SASL_SSL 帐号密码 方式访问 kafka
    Mybatis 获得自动生成主键值
    swo2 SOA OAuth 使用,
    java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp是因为时间字段里有'0000-00-00 00:00:00‘这种格式的日期导致的
    OkHttp3找不到FormEncodingBuilder
    Maven依赖的版本范围
    java lambda求和
  • 原文地址:https://www.cnblogs.com/pythonwl/p/13561789.html
Copyright © 2020-2023  润新知