Django——登录注册,文件上传下载,打包后静态资源无法访问问题解决(md5加密,开启session,生成图片验证码)

1.登录注册

在Web应用程序中,用户的身份验证往往是必不可少的,因此登录注册功能是非常基础的功能。在Django框架中,可以通过自带的auth应用程序来实现登录注册功能。那么简单的用户名和密码的验证这里不过多废话,重点说一下md5加密和开启session以及如何生成图片验证码和返回文件流。

1.md5加密

md5_password = hashlib.md5(password.encode('utf-8')).hexdigest()

上述代码可将password进行md5加密,之后再存储到数据库即可。

2.开启session

  1. 自定义登录验证的装饰器
def session_test(func):
    def inner(request, *args, **kwargs):
        se = request.session.get("name")
        if not se:
            return HttpResponse("message")
        return func(request, *args, **kwargs)
    return inner
  1. 开始session的装饰器
@session_test
def test(request):
	......

在每一个视图函数的上方以@XXX格式添加装饰器即可,XXX为自定义的装饰器的名称。

3.生成图片验证码

生成图片验证码需要用的pillow库。
用法如下:

import random

from PIL import Image, ImageFont, ImageDraw


def get_code():
    mode = 'RGB'
    bg_width = 300
    bg_height = 100
    bg_size = (bg_width, bg_height)
    bg_color = (255, 255, 255)
    ttf_path = 'utils/cambria.ttc'
    img = Image.new(mode, bg_size, bg_color)
    draw = ImageDraw.Draw(img, mode)
    font = ImageFont.truetype(ttf_path, 80)

    # generate text
    letters = get_letters()
    for index, text in enumerate(letters):
        x = 75 * index + 10
        y = 0
        draw.text((x, y), text, get_rdmcolor(), font)

    # blur the background
    for i in range(20000):
        x = random.randint(0, bg_width)
        y = random.randint(0, bg_height)
        fill = get_rdmcolor()
        draw.point((x, y), fill)
    return img, letters


def get_letters():
    base = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
    result = []
    for i in range(4):
        result.append(random.choice(base))
    return result


def get_rdmcolor():
    return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)

然后在视图函数中调用相关函数即可,示例如下

def verification_code(request):
    img, letters = get_code()
    request.session['verification_code'] = ''.join(letters)
    fp = BytesIO()
    img.save(fp, 'png')
    return HttpResponse(fp.getvalue(), content_type='image/png')

2.文件上传下载

简单的文件上传网上的案例还是有很多的,这里重点分享一下关于django项目打包好之后静态资源无法访问的问题以及如何返回文件流。

1.django项目打包之后使用路径拼接的方式无法访问静态资源

例如在项目根目录下有一个media文件夹,media中有图片1.jpg,项目运行在8080端口,setting.py文件中的媒体/静态资源路径配置如下:

# 设置静态文件根目录
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

那么此时我们访问1.jpg图片的拼接路径为:

 http://127.0.0.1:8080/media/1.jpg

但我们打包项目之前会发现图片等文件可以正常访问,但是当项目打包之后却很有可能出现文件上传成功,但是访问失败的情况,经过分析,我们可以发现,django项目打包之后。静态资源是不会一起打包的,此时访问的静态资源文件夹路径在dist/manage/internal下的media文件夹,所以我们如果不再上传新的文件,可以把我们的静态资源文件夹手动拖到该目录下,如图所示:
在这里插入图片描述
那么我们如果需要再次上传文件,就会发现我们上传文件时,manage.exe会自动创建一个和他同级的静态资源文件夹,如图所示:
在这里插入图片描述
但是当文件作为静态资源使用路径直接访问时,程序访问的仍然是interal文件夹下的静态资源文件夹,此时就会出现文件上传成功但是无法访问的情况,此时我们可以通过修改setting.py文件中的media_url相关的变量来解决这种情况,示例如下;

# 设置静态文件根目录
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, '../media')

此时文件上传路径和访问路径就会一致,我们就可以成功访问到静态资源文件夹中的文件,但是,这是还有一个小小的问题,那就是这种方式是直接在浏览器中访问的,那么普通的文件我们当然可以下载,但是像图片或者视频却无法下载,直接直接浏览,此时我们可以用文件流解决这个问题。

2.返回文件流进行文件下载

相关的返回文件流的教程很多,这里仅贴出部分核心代码供大家参考学习

# 构建文件路径或 URL
 file_path = 'http://127.0.0.1:8888/' + file_url  # 替换为实际的文件路径或 URL
 # 发送 HTTP 请求获取文件内容
 response = requests.get(file_path)
 # 返回文件作为响应
 if response.status_code == 200:
     # 获取文件名
     file_name = file_url.split('/')[-1]
     # 返回文件作为响应
     return HttpResponse(
         response.content,
         content_type='application/octet-stream',
         headers={'Content-Disposition': f'attachment; filename="{file_name}"'}
            )

相关总结就到这里,有问题欢迎大家评论区指出。我们一起学习,一起进步🙂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北国137

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值