flask

flask 介绍

安装:pip3 install flask

简单使用

from flask import Flask

app = Flask(__name__)


@app.route('/', methods=['GET'])
def index():
    return 'Hello World'


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

登陆小案例

  主逻辑页:

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

app = Flask(__name__)
app.secret_key = 'sdfsdfsdfsdf'      #配置文件密钥,不写session会报错
USERS = {
    1: {'name': '张三', 'age': 18, 'gender': '', 'text': "道路千万条"},
    2: {'name': '李四', 'age': 28, 'gender': '', 'text': "安全第一条"},
    3: {'name': '王五', 'age': 18, 'gender': '', 'text': "行车不规范"},
}




def auth(func):
    def inner(*args, **kwargs):
        if session.get('username'):
            res = func(*args, **kwargs)  # 真正的执行视图函数,执行视图函数之,判断是否登录
            return res
        else:
            return redirect('/login')
    return inner



@app.route('/login', methods=['GET', 'POST'],endpoint='login')    #使用装饰器必须要写endpoint
def login():
    if request.method == 'GET':
        return render_template('login.html')
    else:
        username = request.form.get('username')
        password = request.form.get('password')
        if username == 'ydh' and password == '123':
            session['username'] = username
            return redirect('/index')
        else:
            return render_template('login.html', err='用户名或密码错误')


@app.route('/index', methods=['GET', 'POST'])
def index():
    username = session.get('username')
    if username:
        return render_template('index.html', users=USERS)
    else:
        return render_template('login.html')


@app.route('/detail/<int:pk>',endpoint='detail')
@auth
def detail(pk):
    user=USERS.get(pk)
    return render_template('detail.html',user=user)

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

  login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="post">
    <p>用户名:<input type="text" name="username"></p>
    <p>密码:<input type="password" name="password"></p>
    <p><input type="submit" value="提交">{{err}}</p>
</form>
</body>
</html>

  detail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>详细信息 {{user.name}}</h1>
    <div>
        {{user.text}}
    </div>

</body>
</html>

  index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>用户列表</h1>
<table>
    {% for k,v in users.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>
    </tr>
    {% endfor %}
</table>
</body>
</html>

flask配置文件

配置方式一:

from flask import Flask

app = Flask(__name__)
app.debug = True         #直接使用app.配置文件


@app.route('/')
def index():
    print(app.debug)     #输出:True
    return '1234'


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

配置方式二:

from flask import Flask

app = Flask(__name__)

app.config['DEBUG']=True

@app.route('/')
def index():
    print(app.config)
    return '1234'


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

  app.config参数详解

{
'DEBUG': False,
'TESTING': False,
'PROPAGATE_EXCEPTIONS': None,
'SECRET_KEY': None,
'PERMANENT_SESSION_LIFETIME': datetime.timedelta(days=31),
'USE_X_SENDFILE': False,
'SERVER_NAME': None,
'APPLICATION_ROOT': '/',
'SESSION_COOKIE_NAME': 'session',
'SESSION_COOKIE_DOMAIN': None,
'SESSION_COOKIE_PATH': None,
'SESSION_COOKIE_HTTPONLY': True,
'SESSION_COOKIE_SECURE': False,
'SESSION_COOKIE_SAMESITE': None,
'SESSION_REFRESH_EACH_REQUEST': True,
'MAX_CONTENT_LENGTH': None,
'SEND_FILE_MAX_AGE_DEFAULT': None,
'TRAP_BAD_REQUEST_ERRORS': None,
'TRAP_HTTP_EXCEPTIONS': False,
'EXPLAIN_TEMPLATE_LOADING': False,
'PREFERRED_URL_SCHEME': 'http',
'TEMPLATES_AUTO_RELOAD': None,
'MAX_COOKIE_SIZE': 4093
}>

DEBUG: 这个配置项用来指定是否处于调试模式。当设置为True时,Flask将提供详细的错误信息和调试页面。在开发过程中,可以将其设置为True,方便调试。在生产环境中,应设置为False,以避免暴露敏感信息。 TESTING: 这个配置项用来指定是否处于测试模式。当设置为True时,Flask将开启测试模式,可以使用测试客户端进行单元测试。在生产环境中,应设置为False。 PROPAGATE_EXCEPTIONS: 这个配置项用来指定是否将异常传播给上层。默认情况下,Flask会在请求处理过程中捕获异常并返回适当的错误页面。将其设置为True时,可以将异常传播给上层处理。 SECRET_KEY: 这个配置项用来指定一个密钥,用于对数据进行加密和签名。在使用Flask的一些功能(如会话、Cookie等)时,需要使用这个密钥。应将其设置为一个随机且安全的字符串。 PERMANENT_SESSION_LIFETIME: 这个配置项用来指定会话的有效期。默认情况下,会话在关闭浏览器后即失效,设置一个较长的时间可以延长会话的有效期。 USE_X_SENDFILE: 这个配置项用来指定是否使用高效的文件传输机制。当设置为True时,可以通过服务器直接发送文件,提高文件传输的效率。 SERVER_NAME: 这个配置项用来指定应用程序运行的服务器名称。在开发环境中,可以将其设置为localhost。在生产环境中,应将其设置为应用程序的域名。 APPLICATION_ROOT: 这个配置项用来指定应用程序的根路径。可以用于将应用程序部署在子路径下。 SESSION_COOKIE_NAME: 这个配置项用来指定会话的Cookie名称。 SESSION_COOKIE_DOMAIN: 这个配置项用来指定会话的Cookie域。 SESSION_COOKIE_PATH: 这个配置项用来指定会话的Cookie路径。 SESSION_COOKIE_HTTPONLY: 这个配置项用来指定会话的Cookie是否只能通过HTTP访问。 SESSION_COOKIE_SECURE: 这个配置项用来指定会话的Cookie是否通过安全连接(HTTPS)发送。 SESSION_COOKIE_SAMESITE: 这个配置项用来指定会话的Cookie的SameSite属性,用于防止跨站点请求伪造。 SESSION_REFRESH_EACH_REQUEST: 这个配置项用来指定每次请求时是否刷新会话的过期时间。 MAX_CONTENT_LENGTH: 这个配置项用来指定请求的最大内容长度。 SEND_FILE_MAX_AGE_DEFAULT: 这个配置项用来指定发送文件的缓存时间,默认为没有缓存。 TRAP_BAD_REQUEST_ERRORS: 这个配置项用来指定是否捕获和记录错误的请求。 TRAP_HTTP_EXCEPTIONS: 这个配置项用来指定是否捕获和处理HTTP异常。 EXPLAIN_TEMPLATE_LOADING: 这个配置项用来指定是否解释模板加载过程,用于调试模板加载错误。 PREFERRED_URL_SCHEME: 这个配置项用来指定URL的默认协议。默认为http,可以设置为https等。 TEMPLATES_AUTO_RELOAD: 这个配置项用来指定模板是否自动重新加载。在开发环境中,可以将其设置为True,以方便修改模板后自动更新。 MAX_COOKIE_SIZE: 这个配置项用来指定Cookie的最大大小。超过该限制的Cookie将被拒绝。

配置文件三:

from flask import Flask

app = Flask(__name__)

app.config.from_pyfile('settings.py')    #将flask的配置文件写在一个settings.py的配置文件中

@app.route('/')
def index():
    print(app.debug)     #输出为True
    return '1234'


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

  settings.py

DEBUG= True

配置文件四:

from flask import Flask

app = Flask(__name__)

app.config.from_object('settings.DevelopmentConfig')      #将配置文件放入py文件中的几个类中,通过更改不同类中的配置文件参数来切换

@app.route('/')
def index():
    print(app.debug)     #输出为True
    return '1234'


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

  settings

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路由系统是基于装饰器的:参数如下:

# rule:路径
# methods :请求方式,列表
# endpoint: 路径别名

转换器:

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

  path示例:

from flask import Flask

app=Flask(__name__)

@app.route('/<path:aa>')
def index(aa):
    print(aa)      #输出:dadwada/dwadawd
    return '4657'


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

  浏览器:

路由系统本质:

def decorator(f: T_route) -> T_route:
    endpoint = options.pop("endpoint", None) #从options弹出,如果没有,就是None ---》@app.route(传了就有,不传就是None)
    self.add_url_rule(rule, endpoint, f, **options)
    return f  # f 就是视图函数,没有对视图函数做事情,只是在执行视图函数之前,加了点操作
    
    
核心:self.add_url_rule(rule, endpoint, f, **options)---》self就是app对象
app.add_url_rule('路由地址', '路由别名', 视图函数, **options)--->跟django很像

add_url_rule的参数详解:

    rule, URL规则,路径地址
    view_func, 视图函数名称
    defaults = None, 默认值, 当URL中无参数,函数需要参数时,使用defaults = {'k': 'v'}
    为函数提供参数
    endpoint = None, 名称,用于反向生成URL,即: url_for('名称')
    methods = None, 允许的请求方式,如:["GET", "POST"]
    #对URL最后的 / 符号是否严格要求
    strict_slashes = None
    #重定向到指定地址
    redirect_to = None, 

 

posted @ 2023-08-04 17:34  秃头不爱学  阅读(178)  评论(0)    收藏  举报