Flask框架 学习小记

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应用
# __name_ 指向程序所在的包
# 初始化参数  import_name Flask 程序所在的包
# static_url_path 静态文件访问路径 可以不传 默认使用:static_folder
# static_folder 静态文件存储的文件夹 可以不传 默认:static
# template_folder 模板文件存储的文件夹 默认:templates

app = Flask(__name__)
app.secret_key = '666'
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
# 配置参数 关闭 CSRF 校验
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)

            # 保存文件 http://127.0.0.1:1000/static/img/1.jpg
            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)
    # abort(Response('Hello World')) # 直接返回浏览器

"""自定义异常处理 404"""
@app.errorhandler(404)
def handle_404_error(error):  # 接受一个错误信息
    """自定义的处理404错误方法"""
    '''这个函数的返回值会是前端所看到的最终的结果 1 '''
    return "出现了404错误,错误信息:%s"%error
#
#     # '''这个函数的返回值会是前端所看到的最终的结果 2 '''
#     # '''可以自己定义请求返回的状态 200 302 403 404 500 等等'''
#     # return "出现了404错误,错误信息:%s" % error,500
#
#     # '''可以重定向页面,进行返回某些数据'''
#     # response = make_response(render_template('test.html', foo=42))
#     # response.headers['X-Parachutes'] = 'parachutes are cool'
#     # return response

"""自定义异常处理 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 = Response()
    response.headers['X-Parachutes'] = 'parachutes are cool'
    return response

from werkzeug.routing import BaseConverter  # 自定义正则

"""自定义转换器"""
class RegexConverter(BaseConverter):
    def __init__(self,url_map,*args):
        # super 重写父类
        super(RegexConverter, self).__init__(url_map)
        # 将第一个接受的参数当作匹配规则进行保存
        self.regex = args[0]

    def to_python(self,value):
        '''
        该函数中的value值代表匹配的值 可以输出查看的
        匹配完成之后 对匹配到的参数作最后一步处理在返回
        '''
        return value      # 返回任何值
        # return int(value) # 如果返回值 匹配int就返回
        # return str(value)   # 如果返回值 匹配str就返回

"""将自定义转换器添加到转换器字典中,并指定使用时的名字: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是不能互相访问的
'''
# 设置cookie
@app.route('/cookie')
def cookie():
    resp = make_response('这是 Cookie')
    # 设置过期时间
    resp.set_cookie('username','tom',max_age=60)
    return resp

# 获取cookie
@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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值