app.py
import os
from flask import Flask, request, jsonify, render_template
from flask import url_for, flash, redirect, abort, Response, make_response,session
from flask_sqlalchemy import SQLAlchemy
from werkzeug.utils import secure_filename
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}
UPLOAD_FOLDER = os.path.dirname(__file__)
app = Flask(__name__)
app.secret_key = '666'
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
app.config['WTF_CSRF_ENABLED'] = False
'###################################################################### 测试GET'
''' 测试传参,给模板传参'''
@app.route('/hello_world/<name>')
def hello_world(name=None):
username = request.cookies.get('username')
print(username)
return render_template('index.html',name=name)
'''GET 请求 传参'''
@app.route('/host',methods=['GET'])
def host():
name = request.args.get('name')
sex = request.args.get('sex')
data = {'name':name,'sex':sex}
return jsonify(data)
'###################################################################### 上传图片'
"""图片限制格式"""
def allowed_file(filename):
return '.' in filename and filename.rsplit('.',1)[-1].lower() in ALLOWED_EXTENSIONS
"""上传文件"""
@app.route('/upload',methods=['GET','POST'])
def upload():
if request.method == 'GET':
return render_template('upload.html')
if request.method == 'POST':
if 'file' not in request.files:
flash('No file part')
return redirect(request.url)
file = request.files['file']
folder = request.form.get('folder')
if file.filename == '':
flash('No selected file')
return redirect(request.url)
if file and allowed_file(file.filename):
path = '/static/' + folder + '/'
end_path = UPLOAD_FOLDER + '/static/' + folder + '/'
if not os.path.exists(end_path):
os.makedirs(end_path)
filename = secure_filename(file.filename)
file.save(end_path + filename)
flash(f'Upload Success! 文件路径:{path+filename}')
return render_template('upload.html',url=path+filename)
else:
flash('Not file or Not allowed')
return redirect(request.url)
'###################################################################### 重定向,捕捉异常,抛出异常'
@app.route('/')
def index():
return redirect(url_for('login'))
@app.route('/login')
def login():
abort(404)
"""自定义异常处理 404"""
@app.errorhandler(404)
def handle_404_error(error):
"""自定义的处理404错误方法"""
'''这个函数的返回值会是前端所看到的最终的结果 1 '''
return "出现了404错误,错误信息:%s"%error
"""自定义异常处理 500"""
@app.errorhandler(500)
def handle_500_error(error):
"""自定义的处理404错误方法"""
'''这个函数的返回值会是前端所看到的最终的结果'''
return "出现了500错误,错误信息:%s"%error
"""全局异常"""
@app.errorhandler(Exception)
def handle_error(error):
return f"{error}"
'################################################################## response 返回,自定义转换器正则'
@app.route('/test')
def test():
response = make_response(render_template('test.html', foo=42))
response.headers['X-Parachutes'] = 'parachutes are cool'
return response
from werkzeug.routing import BaseConverter
"""自定义转换器"""
class RegexConverter(BaseConverter):
def __init__(self,url_map,*args):
super(RegexConverter, self).__init__(url_map)
self.regex = args[0]
def to_python(self,value):
'''
该函数中的value值代表匹配的值 可以输出查看的
匹配完成之后 对匹配到的参数作最后一步处理在返回
'''
return value
"""将自定义转换器添加到转换器字典中,并指定使用时的名字:re"""
app.url_map.converters['re'] = RegexConverter
@app.route('/user/<re("[0-9]{3}"):user_id>')
def regex_test(user_id):
return user_id
'################################################################# 过滤请求,类似django中间件'
"""在第一次请求之前调用,可以在此方法内部做一些初始化操作"""
@app.before_first_request
def before_first_request():
print('before_first_request')
"""
在每一次请求之前调用 这时候已经有请求了,可能在这个方法里面做请求的校验
如果请求的校验不成功 可以直接在此方法中进行响应 直接return之后 那么就不会执行视图函数
"""
@app.before_request
def before_request():
print('before_request')
"""
在执行视图函数之后会调用 并且会把视图函数所生成的响应传入 能够对响应最后一步统一处理
"""
@app.after_request
def after_request(response):
print('after_request')
response.headers['Content-Type'] = 'application/json'
return response
'################################################################# Cookie 用户登录状态保持'
'''
Cookie: 指某些网站为了辨别用户身份 进行绘画跟踪而存储用户在本地的数据
存储在浏览器当中一段纯文本信息 不同的域名 Cookie是不能互相访问的
'''
@app.route('/cookie')
def cookie():
resp = make_response('这是 Cookie')
resp.set_cookie('username','tom',max_age=60)
return resp
@app.route('/getcookie')
def get_cookie():
resp = request.cookies.get('username')
return resp
'################################################################# Session 会话'
'''
在服务器保持session
Session依赖于cookie
'''
@app.route('/session')
def make_session():
session['username'] = 'jack'
return redirect(url_for('get_session'))
@app.route('/get_session')
def get_session():
return session.get('username')
if __name__ == '__main__':
app.run(host='127.0.0.1',port=1000,debug=True)