path('register/',views.register)
from django import forms
from django.forms import widgets
class RegForm(forms.Form):
user = forms.CharField(max_length=32,widget=widgets.TextInput(attrs={'class':'form-control'}),label='用户名')
pwd = forms.CharField(max_length=32,widget=widgets.PasswordInput(attrs={'class':'form-control'}),label='密码')
re_pwd = forms.CharField(max_length=32,widget=widgets.PasswordInput(attrs={'class':'form-control'}),label='确认密码')
email = forms.EmailField(max_length=32,widget=widgets.EmailInput(attrs={'class':'form-control'}),label='邮箱')
def register(request):
if request.is_ajax():
form = RegForm(request.POST)
response = {'user': None,'msg': None}
if form.is_valid():
response['user'] = form.cleaned_data.get('user')
else:
response["msg"] = form.errors
return JsonResponse(response)
form = RegForm()
return render(request,'register.html',{'form': form})
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
<link rel="stylesheet" href="{% static 'blog_app/bootstrap/css/bootstrap.css' %}">
<script src="{% static 'blog_app/jq.js' %}"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<h3>注册</h3>
<hr>
<form>
{% csrf_token %}
{% for field in form %} {# 循环form表单对象,field表示每一个字段 #}
<div class="form-group">
<label for="{{ field.auto_id }}">{{ field.label }}</label> {# field.auto_id表示生成表单时的id值 #}
{{field}}
</div>
{% endfor %}
<div class="form-group">
<label for="avatar">
头像
<img src="/static/blog_app/default.png" width="70px" height="70px" id="avatar_img">
</label>
<input type="file" id="avatar" style="display: none">
</div>
<input type="button" class="btn btn-success register_btn" value="注册" id="register_btn"><span class="error"></span>
</form>
</div>
</div>
</div>
<script>
$('#avatar').change(function(){
var file_obj = $(this)[0].files[0]
var reader = new FileReader()
reader.readAsDataURL(file_obj)
reader.onload = function(){
$('#avatar_img').attr('src',reader.result)
}
})
$('#register_btn').click(function (){
var formdata = new FormData()
formdata.append("user",$('#id_user').val())
formdata.append("pwd",$('#id_pwd').val())
formdata.append("re_pwd",$('#id_re_pwd').val())
formdata.append("email",$('#id_email').val())
formdata.append("avatar",$('#avatar')[0].files[0])
formdata.append("csrfmiddlewaretoken",$('[name="csrfmiddlewaretoken"]').val())
$.ajax({
url: '',
type: 'post',
contentType: false,
processData: false,
data: formdata,
success: function (data) {
console.log(data)
}
})
})
</script>
</body>
</html>
Django——基于Ajax的登录功能实现
urlpatterns = [
path('admin/', admin.site.urls),
path('login/',views.login),
path('get_validCode_img/',views.get_validCode_img),
path('index/',views.index),
]
from django.http import JsonResponse
from django.shortcuts import render,HttpResponse
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import random
from io import BytesIO
from django.contrib import auth
def login(request):
if request.method == 'POST':
response = {'user': None,'msg': None}
user = request.POST.get('user')
pwd = request.POST.get('pwd')
valid_code = request.POST.get('valid_code')
valid_code_str = request.session.get('valid_code_str')
if valid_code.upper() == valid_code_str.upper():
user = auth.authenticate(username=user,password=pwd)
if user:
auth.login(request,user)
response['user'] = user.username
else:
response['msg'] = 'username or password error'
else:
response['msg'] = 'valid code error'
return JsonResponse(response)
return render(request,'login.html')
def get_validCode_img(request):
def get_random_color():
return (random.randint(0,255),random.randint(0,255),random.randint(0,255))
img = Image.new("RGB",(270,40),color=get_random_color())
draw = ImageDraw.Draw(img)
font = ImageFont.truetype("static/blog_app/font/AaMingYueJiuLinTian.ttf",size=30)
valid_code_str = ""
for i in range(5):
random_num = str(random.randint(0,9))
random_low_alpha = chr(random.randint(95,122))
random_upper_alpha = chr(random.randint(65,90))
random_char = random.choice([random_num,random_low_alpha,random_upper_alpha])
draw.text((i*20+80,5),random_char,get_random_color(),font=font)
valid_code_str += random_char
request.session["valid_code_str"] = valid_code_str
f = BytesIO()
img.save(f,'png')
data = f.getvalue()
return HttpResponse(data)
def index(request):
return HttpResponse('登录成功')
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
<link rel="stylesheet" href="{% static 'blog_app/bootstrap/css/bootstrap.css' %}">
<script src="{% static 'blog_app/jq.js' %}"></script>
</head>
<body>
<h3>登录</h3>
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<form>
{% csrf_token %}
<div class="form-group">
<label for="user">用户名</label>
<input type="text" id="user" class="form-control">
</div>
<div class="form-group">
<label for="pwd">密码</label>
<input type="password" id="pwd" class="form-control">
</div>
<div class="form-group">
<label for="">验证码</label>
<div class="row">
<div class="col-md-6">
<input type="text" class="valid_code form-control" id="valid_code">
</div>
<div class="col-md-6">
<img src="/get_validCode_img/" alt="验证码图片" width="270" height="40" id="valid_code_img">
</div>
</div>
</div>
<input type="button" class="btn btn-info login_btn" value="登录" id="login_btn"><span class="error"></span>
<a href="/register/" class="btn btn-success">注册</a>
</form>
</div>
</div>
</div>
<script>
$('#valid_code_img').click(function(){
$(this)[0].src +="?"
})
$('#login_btn').click(function(){
$.ajax({
url: '',
type: 'post',
data: {
user: $('#user').val(),
pwd: $('#pwd').val(),
valid_code: $('#valid_code').val(),
csrfmiddlewaretoken: $('[name="csrfmiddlewaretoken"]').val(),
},
success: function (res) {
console.log(res)
if(res.user){
location.href="/index/"
}
else {
$('.error').text(res.msg).css({color: 'red'})
}
}
})
})
</script>
</body>
</html>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现