1.登录注册
在Web应用程序中,用户的身份验证往往是必不可少的,因此登录注册功能是非常基础的功能。在Django框架中,可以通过自带的auth应用程序来实现登录注册功能。那么简单的用户名和密码的验证这里不过多废话,重点说一下md5加密和开启session以及如何生成图片验证码和返回文件流。
1.md5加密
md5_password = hashlib.md5(password.encode('utf-8')).hexdigest()
上述代码可将password进行md5加密,之后再存储到数据库即可。
2.开启session
- 自定义登录验证的装饰器
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
- 开始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}"'}
)
相关总结就到这里,有问题欢迎大家评论区指出。我们一起学习,一起进步🙂