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,

浙公网安备 33010602011771号