ajax写登录页面
静态配置
STATICFILES_DIRS = (
os.path.join(BASE_DIR,'my_blog','static'),
)
AUTH_USER_MODEL = "app01.UserInfo"
setting
表结构:models
from django.db import models
from django.conf import settings
from django.contrib.auth.models import AbstractUser
# Create your models here.
class UserInfo(AbstractUser): #settings :AUTH_USER_MODEL ="项目名称.UserInfo"
'''用户信息表'''
nid = models.BigAutoField(primary_key=True)
nickname =models.CharField(max_length=32,verbose_name="昵称",unique=True)
tel = models.IntegerField(verbose_name="电话",unique=True,null=True,blank=True)
email = models.CharField(max_length=64,verbose_name="邮箱")
avatar = models.FileField(verbose_name="头像",upload_to="avatar",default="/avatar/default.png")
create_time = models.DateTimeField(verbose_name="创建时间",auto_now_add=True) class Meta:
verbose_name_plural = "用户信息表"
def __str__(self):
return self.username class Article(models.Model):
'''
文章表
'''
title = models.CharField(max_length=64,verbose_name="文章标题")
summary = models.CharField(max_length=244, verbose_name="文章概要")
create_time = models.DateTimeField(verbose_name="创建时间",auto_now_add=True)
update_time = models.DateTimeField(verbose_name="修改时间",auto_now=True)
poll_count = models.IntegerField(verbose_name="点赞数",default=0)
comment_count = models.IntegerField(verbose_name="评论数",default=0)
read_count = models.IntegerField(verbose_name="阅读数",default=0)
# is_essence = models.BooleanField(verbose_name="是否精华",default=0)
# is_top = models.BooleanField(verbose_name="是否置顶",default=0) user = models.ForeignKey(to="UserInfo",verbose_name="所属作者",null=True,blank=True)
classify = models.ForeignKey(to="Classfication",verbose_name="所属类别",null=True,blank=True)
tags = models.ManyToManyField(to="Tag",through="Article2tag",through_fields=('article', 'tag'),verbose_name="所属标签")
type_choices = [
(1,"编程语言"),
(2,"软件设计"),
(3,"前端系列"),
(4,"数据库"),
(5,"操作系统")
]
artcle_type_id = models.IntegerField(choices=type_choices,default=None)
class Meta:
verbose_name_plural = "文章表"
def __str__(self):
return self.title class Article_detail(models.Model):
'''文章细节表'''
article = models.OneToOneField(to="Article",verbose_name="所属文章")
content =models.TextField(max_length=400,verbose_name="文章内容") class Meta:
verbose_name_plural = "文章细节表" class Tag(models.Model):
'''标签表'''
name = models.CharField(max_length=32,verbose_name="标签名")
blog = models.ForeignKey(to="Blog",verbose_name="所属博客")
class Meta:
verbose_name_plural = "标签表" class Article2tag(models.Model):
article = models.ForeignKey(verbose_name="文章",to="Article")
tag = models.ForeignKey(verbose_name="标签",to="Tag")
class Meta:
'''联合唯一'''
unique_together = [
("article","tag")
] class Comment(models.Model):
'''评论表'''
time = models.DateTimeField(verbose_name="评论时间",auto_now_add=True)
content = models.CharField(max_length=265,verbose_name="评论内容")
up_count = models.IntegerField(default=0)
user = models.ForeignKey(to="UserInfo",verbose_name="评论人",null=True,blank=True)
article = models.ForeignKey(to="Article",verbose_name="评论文章",null=True,blank=True)
farther_comment = models.ForeignKey(to="Comment",verbose_name="父级评论",null=True,blank=True)
# farther_comment = models.ForeignKey("self",verbose_name="父级评论",null=True,blank=True) class Meta:
verbose_name_plural = "评论表" class Article_poll(models.Model):
'''文章点赞表'''
time = models.DateTimeField(verbose_name="点赞时间",auto_now_add=True)
article = models.ForeignKey(to="Article",verbose_name="点赞文章",null=True,blank=True) #一个文章可以有多个赞
user = models.ForeignKey(to="UserInfo",verbose_name="点赞人",null=True,blank=True)
# is_positive = models.BooleanField(default=1,verbose_name="点赞或踩") class Meta:
'''联合唯一'''
unique_together = ("user", "article",)
verbose_name_plural = "文章点赞表" class Comment_poll(models.Model):
'''评论点赞表'''
time=models.DateTimeField(verbose_name="点赞时间",auto_now_add=True)
# is_positive = models.BooleanField(verbose_name="点赞或踩",default=1)
user = models.ForeignKey(to="UserInfo",verbose_name="点赞用户",null=True,blank=True)
comment = models.ForeignKey(to="Comment",verbose_name="点赞所属评论",null=True,blank=True) #一个评论可以有多个赞 class Meta:
'''联合唯一'''
unique_together = ("user","comment",)
verbose_name_plural = "评论点赞表" class Blog(models.Model):
'''个人站点表'''
title = models.CharField(max_length=32,verbose_name="个人博客标题")
url = models.CharField(max_length=64,verbose_name="路径",unique=True)
theme = models.CharField(max_length=32,verbose_name="博客主题")
user = models.OneToOneField(to="UserInfo", verbose_name="所属用户")
class Meta:
'''通过admin录入数据的时候个中文显示'''
verbose_name_plural = "个人站点表" def __str__(self):
return self.title class Classfication(models.Model):
'''博主个人文章分类表'''
title = models.CharField(max_length=32, verbose_name="分类标题")
blog = models.ForeignKey(to="Blog",verbose_name="所属博客") class Meta:
verbose_name_plural = "分类表"
models
HTML:先引入bootstrap
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="/static/dist/js/jquery-3.1.1.js"></script>
<script src="/static/dist/js/bootstrap.js"></script> <link rel="stylesheet" href="/static/dist/css/bootstrap.css"> <link rel="stylesheet" href="/static/css/login.css">
</head>
<body> <div class="container"> <div class="row">
<div class="col-md-5 col-md-offset-3">
<form><h1>欢迎您进入登陆页面</h1>
{% csrf_token %}
<div class="form-group">
<label for="username">用户名</label>
<input type="text" class="form-control" id="username" placeholder="用户名">
</div>
<div class="form-group">
<label for="password">密码</label>
<input type="password" class="form-control" id="password" placeholder="密码">
</div> <div class="row validCode">
<div class="col-md-6">
<div class="form-group">
<label for="validCode">验证码</label>
<input type="text" class="form-control validCode_text" id="validCode"
placeholder="验证码">
</div>
</div>
<div class="col-md-6"> <img class="validCode_img" src="/get_validCode_img/" alt="" width="200px" height="50px">
</div>
</div>
<div class="row">
<div class="col-md-6"> <p> <span class="error"></span> <input type="button" value="登录" class="btn btn-primary btn-block " id="sub"></p>
</div>
<div class="col-md-6">
<input type="button" value="注册" class="btn btn-success btn-block " id="sub">
</div>
</div> </form>
</div>
</div>
</div> <script>
$("#sub").click(function () {
$.ajax({
url: "/login/",
type: "POST",
data: {
"username": $("#username").val(),
"password": $("#password").val(),
"validCode": $("#validCode").val(),
"csrfmiddlewaretoken": $("[name='csrfmiddlewaretoken']").val(), },
success: function (data) {
console.log(data)
var response = JSON.parse(data);
if (response["is_login"]) {
location.href = "/index/"
}
else {
$(".error").html(response["error_msg"]).css("color", "yellow")
}
} })
})
</script> </body>
</html>
login
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^get_validCode_img/',views.get_validCode_img),
url
视图函数:views
from django.shortcuts import render,redirect,HttpResponse
from app01 import models
from app01 import *
from my_blog import settings
from django.contrib import auth def login(request):
if request.is_ajax():
username=request.POST.get("username")
password=request.POST.get("password")
validCode=request.POST.get("validCode") login_response = {"is_login": False, "error_msg": None}
if validCode.upper() == request.session.get("keepValidCode").upper():
user = auth.authenticate(username=username, password=password)
if user:
login_response["is_login"] = True
auth.login(request, user) else:
login_response["error_msg"] = "username or password error" else:
login_response["error_msg"] = 'validCode error' import json return HttpResponse(json.dumps(login_response)) return render(request, "login.html") def get_validCode_img(request):
from io import BytesIO
import random from PIL import Image,ImageDraw,ImageFont
img = Image.new(mode="RGB", size=(120, 40),
color=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))) draw = ImageDraw.Draw(img, "RGB")
font = ImageFont.truetype("my_blog/static/font/kumo.ttf", 25) valid_list = []
for i in range(5):
random_num = str(random.randint(0, 9))
random_lower_zimu = chr(random.randint(65, 90))
random_upper_zimu = chr(random.randint(97, 122)) random_char = random.choice([random_num, random_lower_zimu, random_upper_zimu])
draw.text([5 + i * 24, 10], random_char,
(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)), font=font)
valid_list.append(random_char)
# 画点
for i in range(40):
draw.point([random.randint(0, 120), random.randint(0, 40)]) # 画线
# for i in range(5):
# draw.line(
# (random.randint(0, 120), random.randint(0, 40), random.randint(0, 120), random.randint(0, 40))) f = BytesIO()
img.save(f, "png")
data = f.getvalue()
#
valid_str = "".join(valid_list)
print(valid_str) request.session["keepValidCode"] = valid_str return HttpResponse(data)
views
ajax写登录页面的更多相关文章
- 11月10日上午ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库
1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...
- ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库
1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...
- 使用PHP中的ajax做登录页面、验证用户名是否可用、动态调用数据库
1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...
- 14.ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库
1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...
- ajax 写登录
AJAX的全称是Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). ajax的优点: 1.最大的一点是页面无刷新,用户的体验非常好. 2.使用 ...
- ajax——用ajax写登陆页面
ajax.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...
- ajax 做登录 实现页面免刷新
结合之前学的知识,可以用ajax来传递数据,实现页面不用刷新,仅数据刷新,来看一下ajax是怎么来实现页面免刷新的 方的是客户端,圆的是服务器 如果没有ajax的话,客户端直接把数据传给服务器,服务器 ...
- 11.10 (上午)开课二个月零六天(ajax基础,ajax做登录)
test.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...
- Ajax方法实现登录页面
Note: ajax技术 不用刷新页面,做局部刷新不用form表单,因为不需要提交,通过JQuery控制必须要有id如果要用ajax可以用JQuery也可以用js写,推荐JQuery 因为简单,直接引 ...
随机推荐
- Office Web Add-in的技术原理和开发常见问题剖析
作者:陈希章 发表于 2017年12月20日 我过去发表过一些Office Add-in开发的文章,并且也在不同的场合分享过新的开发模式及其带来的机遇.有不少朋友给我反馈,也讨论到一些常见问题,我这里 ...
- 自学Zabbix3.2-配置功能简介
zabbix配置功能介绍 zabbix配置内容比较多,我们要分为9大块来讲解.分别如下: 1. 主机与组 添加主机配置与组配置. 1.1.创建主机方法 1.1.1 新建主机 c ...
- redis的set类型
1.简单描述 redis的set类型是string类型数值的无序集合.set元素最大可以包含2的32次方减1个元素.由于set类型是通过hash table实现(旧版本是这样,新版本不确定是不是改用了 ...
- 这么说吧,java线程池的实现原理其实很简单
好处 : 线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一分配.调优和监控,有以下好处: 1.降低资源消耗: 2.提高响应速度: 3.提高线 ...
- 【java】内存流:java.io.ByteArrayInputStream、java.io.ByteArrayOutputStream、java.io.CharArrayReader、java.io.CharArrayWriter
package 内存流; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java. ...
- mkpasswd 随机密码生成
root@op-admin:~# mkpasswd -l -n usage: mkpasswd [args] [user] where arguments are: -l # (length of p ...
- go实例之函数
1.可变参数 示例代码如下: package main import "fmt" // Here's a function that will take an arbitrary ...
- jsp上的九个隐含对象
首先说一说件jsp的原理.jsp被认为最经典的解释是 “嵌入了java 代码的html”. 在网上查了一些资料,和我本身对jsp的认识,总结如下: jsp本质上是一个servlet,继承自 当第一次 ...
- 599. Minimum Index Sum of Two Lists
Suppose Andy and Doris want to choose a restaurant for dinner, and they both have a list of favorite ...
- 扩展Microsoft Graph数据结构(开放扩展)
作者:陈希章 发表于 2018年1月2日 前言 Microsoft Graph是一张拥有巨大价值的网络,它定义了包括Office 365在内的资源的实体及其关系,它的价值体现在,随着用户积累的数据越来 ...