Flask01--flask介绍、快速使用、登录和展示信息案例、配置文件

1 Flask介绍

# 介绍
  Flask是一个基于Python开发,并且依赖jinja2模板(DTL)和Werkzeug(wsgiref) WSGI服务的一个微型web框架。
  对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,
  然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,
  并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,
  即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器

# flask项目的所有代码都可以写在一个py文件中(一般不用),也可以按照不同拆分 (可扩展性高)

# 通过集成很多第三方插件实现跟django一样的功能

# wsgiref 

2 快速使用

from flask import Flask

app = Flask(__name__)


@app.route('/')
def index():  # 也不需要request 参数
    return 'hello flask'  # 返回字符串即可,flask自动包装成 Httpresponse对象


if __name__ == '__main__':
    app.run()  # 启动flask项目

2.1 Flask类的参数详解

### 必填参数:
import_name = __name__  # 接收包或者模块的名字作为参数,但一般都是传递__name__


### 常用参数:
static_folder = 'static',  # 静态文件目录的路径 默认当前项目中的static目录
static_url_path = None,  # 静态文件目录的url路径 默认不写是与static_folder同名,远程静态文件时复用
template_folder = 'templates'  # template模板目录, 默认当前项目中的 templates 目录


### 不常用参数:
static_host = None,  # 远程静态文件所用的Host地址,默认为空
# host_matching是否开启host主机位匹配,是要与static_host一起使用,如果配置了static_host, 则必须赋值为True
# 这里要说明一下,@app.route("/",host="localhost:5000") 就必须要这样写
# host="localhost:5000" 如果主机头不是 localhost:5000 则无法通过当前的路由
host_matching = False,  # 如果不是特别需要的话,慎用,否则所有的route 都需要host=""的参数

subdomain_matching = False,  # 理论上来说是用来限制SERVER_NAME子域名的,但是目前还没有感觉出来区别在哪里

instance_path = None,  # 指向另一个Flask实例的路径  以文件导入配置的方式才行
instance_relative_config = False  # 是否加载另一个实例的配置    

root_path = None  # 主模块所在目录的绝对路径,默认为项目目录

3 登录,显示用户信息案例

### 总结
  1 当次请求的对象,request对象是全局的,直接导入使用即可
    
  2 前端post提交的数据,在flask中:request.form中取

  3 转换器的使用/detail/<int:pk>   等同于django中的有名分组
        
  4 模板语法兼容django的DTL,可以直接使用函数加括号,并且可以传参数

  5 session也是全局对象,用户登录信息,放到session中,使用session存值,需要先设置密钥
      app.secret_key = 'adfae^^4384045532@@#$#'
    
  6 返回对象:新手四件套
    '字符串'           ---> HttpResonse('字符串')
    redirect('/')     ---> redirect('/')
    render_template() ---> render()
    jsonify           ---> JsonResponse()
    
  7 前端get请求提交的数据,在flask中:request.args中取  包装成字典获取
    # eg;request.args.get('pk')

  8 get请求 ?后面的内容,完整以bytes格式字符串,在flask中:request.query_string中取
    # eg: b'pk=1&name=lqz&age=19'
    
  9 @app.route('/detail', methods=['GET'],endpoint='detail')  
     - 第一个参数:路由匹配
     - methods参数:允许的请求方式,默认不写为GET
     - endpoint参数:等同于django路由中的name别名   endpoint  n. 端点

3.1 flask代码

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

# flask中的请求对象是全局的request
# render_template 就是django的render

app = Flask(__name__)

# 使用session,一定要设置秘钥,等同于django配置文件中的密钥
app.secret_key = 'adfae^^4384045532@@#$#'

app.debug = True  # 启用调试模式,修改了代码不用重启,自动重启

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


@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    else:
        # request.form 等同于request.POST
        name = request.form.get('user')
        password = request.form.get('pwd')
        if name == 'lqz' and password == '123':
            # 登录成功,重定向到首页
            # 把登录信息放到session中
            session['name'] = name
            return redirect('/')
        else:
            return jsonify({'code': 101, 'msg': '用户名或密码错误'})


@app.route('/', methods=['GET'])
def index():
    if session.get('name'):
        return render_template('index.html', user_dict=USERS)
    else:
        # 没有登录,重定向到登陆页面
        return redirect('/login')

# 获取url路径后的参数值
# @app.route('/detail/<int:pk>', methods=['GET'])
# def detail(pk):
#	print(pk)
#   user_detail = USERS.get(pk)
#   return render_template('detail.html', info=user_detail)

# 获取get ?后面的参数值
@app.route('/detail', methods=['GET'],endpoint='detail')
def detail():
    print(request.query_string)  # b'pk=1&name=lqz&age=19'
    pk = int(request.args.get('pk'))
    user_detail = USERS.get(pk)
    return render_template('detail.html', info=user_detail)


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

3.2 detail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>
 <h1>详细信息 {{info.name}}</h1>
    <div>
        {{info.text}}
    </div>
</body>
</html>

3.3 index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>
    <h1>用户列表</h1>
    <table>
        {% 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}}">查看详细1</a></td>
            <td><a href="/detail?pk={{k}}&name=lqz&age=19">查看详细2</a></td>
        </tr>
        {% endfor %}
    </table>
</body>
</html>

3.4 login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>用户登录</h1>
<form method="post">
    <input type="text" name="user">
    <input type="text" name="pwd">
    <input type="submit" value="登录">{{error}}
</form>
</body>
</html>

4 Flask配置文件

4.1 常见配置参数

# flask中的配置文件
  是一个flask.config.Config对象(继承字典)
    
# 默认配置
{
  'DEBUG':                                get_debug_flag(default=False),  是否开启Debug模式
  'TESTING':                              False,                          是否开启测试模式
  'PROPAGATE_EXCEPTIONS':                 None,                          
  'PRESERVE_CONTEXT_ON_EXCEPTION':        None,
  'SECRET_KEY':                           None,
  'PERMANENT_SESSION_LIFETIME':           timedelta(days=31),
  'USE_X_SENDFILE':                       False,
  'LOGGER_NAME':                          None,
  'LOGGER_HANDLER_POLICY':               'always',  
  'SERVER_NAME':                          None,
  'APPLICATION_ROOT':                     None,
  'SESSION_COOKIE_NAME':                  'session',
  'SESSION_COOKIE_DOMAIN':                None,
  'SESSION_COOKIE_PATH':                  None,
  'SESSION_COOKIE_HTTPONLY':              True,  
  'SESSION_COOKIE_SECURE':                False,
  'SESSION_REFRESH_EACH_REQUEST':         True,
  'MAX_CONTENT_LENGTH':                   None,
  'SEND_FILE_MAX_AGE_DEFAULT':            timedelta(hours=12),
  'TRAP_BAD_REQUEST_ERRORS':              False,
  'TRAP_HTTP_EXCEPTIONS':                 False,
  'EXPLAIN_TEMPLATE_LOADING':             False,
  'PREFERRED_URL_SCHEME':                 'http',
  'JSON_AS_ASCII':                        True,
  'JSON_SORT_KEYS':                       True,
  'JSONIFY_PRETTYPRINT_REGULAR':          True,
  'JSONIFY_MIMETYPE':                     'application/json',
  'TEMPLATES_AUTO_RELOAD':                None,
}  

4.2 设置flask配置

# 查看配置信息
  from flask import Flask
  app = Flask(__name__)

  print(app.config)

# flask把常用的配置,放进了app对象这一层,但实质是在app.config中,且当做字典使用
  app.debug = True
  app.secret_key = 'asdahdaabsd'

  # 实质:
  app.config['DEBUG']=True
  app.config['SECRET_KEY']='asdfasdfasdfasfasfdasfasfsfa'


### 设置Flask配置的方式:

# 方式一:直接写        一般不用
  app.config['DEBUG']=True

    
    
# 方式二:通过py文件    一般不用 
  # 配置文件 settings.py
    DEBUG = True
    SECRET_KEY = 'asdahdaabsd'
    
  # flask主程序,导入配置文件 
  app.config.from_pyfile('配置文件.py')
 

  # 注:settings.py文件的路径位置:
  settings.py文件默认要放在程序root_path目录,  # 即:和flask主模块的同一层
    
  # 也可以导入其他flask实例/其他文件夹下的配置文件
  instance_relative_config=True,
  instance_path='其他flask实例'   # 注:必须是绝对路径



# 方式三:通过环境变量    一般不用
  app.config.from_envvar("环境变量名称")
    
  # 通过json文件、字典   一般不用
  app.config.from_json("json文件名称")
    注:JSON文件名称,必须是json格式,因为内部会执行json.loads
    
  # 通过字典            一般不用
  app.config.from_mapping({'DEBUG': True})

    
    
    
# 方式四:通过类的方式     常用
  # 配置文件 setting.py    # 默认:放在和flask主程序同一层
    # 配置基类
    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
    
  # flask主程序,导入配置文件 
  app.config.from_object('settings.DevelopmentConfig')
posted @ 2022-08-01 16:35  Edmond辉仔  阅读(110)  评论(0)    收藏  举报