zoukankan      html  css  js  c++  java
  • 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
      • 多个装饰器的应用
  • 相关阅读:
    转载: 如何让form表单在enter键入时不提交
    26个Jquery使用小技巧
    PHP网站页面静态化的生成方法介绍
    用jquery绑定输入框正在输入时返回操作
    PHP开发规范手册之PHP代码规范详解
    Web开发中9个有用的提示和技巧
    TSINGSEE青犀视频边缘计算网关EasyNVR在视频整体监控解决方案中的应用分析
    应急消防通道总是被占用?安防告警视频平台越加必要
    新冠疫情涨涨落落,企业做好线上办公该如何转型?
    【解决方案】如何实现AI自动识别高空抛物行为?
  • 原文地址:https://www.cnblogs.com/saoqiang/p/12467497.html
Copyright © 2011-2022 走看看