from django.db import models

# Create your models here.
from django.contrib.auth.models import AbstractUser #用户
class UserInfo(AbstractUser):
nid=models.AutoField(primary_key=True)
telephone=models.CharField(max_length=32)
avatar=models.FileField(upload_to='avatar/',default='avatar/default.png')
create_data=models.DateTimeField(auto_now_add=True)
blog=models.OneToOneField(to='Blog',to_field='nid',on_delete=models.CASCADE,null=True) #站点(与用户一对一关系,不同用户所属的个人网站)
class Blog(models.Model):
nid=models.AutoField(primary_key=True)
#博客名称
title=models.CharField(max_length=32)
#站点的名称
site_name=models.CharField(max_length=32)
#博客主题样式
theme=models.CharField(max_length=32) #分类:自己创建的分类
class Category(models.Model):
nid=models.AutoField(primary_key=True)
#分类名称
title=models.CharField(max_length=32)
#所属博客: 这个分类属于哪个站点
blog=models.ForeignKey(to='Blog',to_field='nid',on_delete=models.CASCADE,null=True) #标签
class Tag(models.Model):
nid=models.AutoField(primary_key=True)
# 标签名称
title=models.CharField(max_length=32)
# 所属博客,跟Blog一对多 这个标签属于哪个站点
blog=models.ForeignKey(to='Blog',to_field='nid',on_delete=models.CASCADE,null=True) #文章
class Article(models.Model):
nid=models.AutoField(primary_key=True)
# 文章标题
title=models.CharField(max_length=32)
# 文章摘要
desc=models.CharField(max_length=255)
# 文章内容,存大文本
content=models.TextField()
#创建时间
create_date=models.DateTimeField(auto_now_add=True)
#跟user一对多,一个用户可以创建多篇文章
user=models.ForeignKey(to='UserInfo',to_field='nid',null=True)
#跟Category分类表一对多:一个分类对应多篇文章
category=models.ForeignKey(to='Category',to_field='nid',null=True)
#文章标题:与标签多对多关系,通过through指定自己写的中间表
#手动创建第三张表
tag=models.ManyToManyField(to='Tag',through='Article2Tag',through_fields=('article','tag')) #文章与标签多对多关系表
class Article2Tag(models.Model):
nid=models.AutoField(primary_key=True)
#文章id
article=models.ForeignKey(to='Article',to_field='nid',null=True)
#标签id
tag=models.ForeignKey(to='Tag',to_field='nid',null=True) class ArticleUpDown(models.Model):
nid=models.AutoField(primary_key=True)
# 点赞/点踩 的用户
user=models.ForeignKey(to='UserInfo',to_field='nid',null=True)
# 点赞/点踩 的文章
article=models.ForeignKey(to='Article',to_field='nid',null=True)
# 赞还是踩
is_up=models.BooleanField(default=True) #评论
class Comment(models.Model):
nid=models.AutoField(primary_key=True)
# 评论的用户:一个用户可以有多条评论
user = models.ForeignKey(to='UserInfo', to_field='nid')
#评论的文章:一个文章可以对应多条评论
article=models.ForeignKey(to='Article',to_field='nid')
# 评论的内容
comm = models.CharField(max_length=255)
# 评论的时间
create_date = models.DateTimeField(auto_now_add=True) #因为可能会有自评论的情况:例如回复,所有要在评论表本身建立自关联
# parent_comment=models.ForeignKey(to='Comment',to_field='nid') #2种写法,例如comment
# 父评论的id,自关联,防止写脏数据
parent_comment = models.ForeignKey(to='self', to_field='nid', null=True)

models.py

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/bootstrap-3.3.7-dist/css/bootstrap.min.css">
<script src="/static/jquery-3.3.1.js"></script>
<title>博客园登录</title>
</head>
<body> <div class="container-fluid">
<div class="row">
<div class="col-md-6 col-md-offset-3">
{% csrf_token %}
<div class="form-group">
<label for="id_name">用户名</label>
<input type="text" id="id_name" class="form-control"> </div>
<div class="form-group">
<label for="id_pwd">密码</label>
<input type="password" id="id_pwd" class="form-control"> </div>
<div class="form-group">
<label for="valid_code">验证码</label>
<div class="row">
<div class="col-md-6">
<input type="text" id="valid_code" class="form-control"> </div> <div class="col-md-6">
<!--img标签里面可以,写一个图片地址,也可以写二进制-->
<img src="/get_code/" alt="" id="cod_img"> </div> </div> </div> <div>
<button class="btn btn-danger " id="submit_btn">提交</button><span class="error"></span>
</div> </div> </div> </div>
<script>
<!--给验证码图片绑定点击事件,实现点击验证码能够获取新的验证码-->
$('#cod_img').click(function () {
$('#cod_img')[0].src=$('#cod_img')[0].src+'?'
}) $('#submit_btn').click(function () {
$.ajax({
url:'',
type:'post',
data:{
'name':$('#id_name').val(),
'pwd':$('#id_pwd').val(),
'valid_code':$('#valid_code').val(),
'csrfmiddlewaretoken':"{{ csrf_token }}", },
success:function(data){
<!--如果成功打印返回的back_msg={'user':None,'msg':None}字典类型-->
if (data.user){
//data是个object对象
alert(data.msg) //登录成功
}else {
$('.error').text(data.msg)
setTimeout(function () {
$('.error').text('')
},1000)
} }
})
}) </script> </body>
</html>

login.html

csrf攻击:

 

session:不用的浏览器在数据库里对应一条session

form表单渲染:

BBS-登录的更多相关文章

  1. BBS登录功能

    BBS登录功能 一.后端实现 1.实现验证码 from PIL import Image, ImageDraw, ImageFont import random from io import Byte ...

  2. 1209 BBS 登录

    目录 上周内容 今日内容 url.py views.py login home.html 逻辑流程 登录功能 上周内容 bbs项目 项目开发流程 需求分析 架构设计 分组开发 我们一般情况下都只是作用 ...

  3. BBS登录与注册功能

    登录功能 视图函数 def my_login(request): if request.method == 'GET': return render(request, 'login.html') el ...

  4. ucenter用户登录过程

    以用户登录为例介绍,其它注销,改密码,消息,头像,好友均类同. 从用户xxx在某一应用程序的login.php,输入用户名,密码讲起.先用uc_user_login函数到uc_server验证此用户和 ...

  5. B/S系统间跨域单点登录设计思路

    基于B/S系统间单点登录 此处说的单点登录的概念,即不同系统公用一个登录界面.一处系统通过登录验证,在接入的各系统均为登录状态.一般有两种情景: 1)  一级域名相同 例如:tieba.baidu.c ...

  6. HttpClient相关

    HTTPClient的主页是http://jakarta.apache.org/commons/httpclient/,你可以在这里得到关于HttpClient更加详细的信息 HttpClient入门 ...

  7. HttpClient,DefaultHttpClient使用详解

    HttpClient:是一个接口 首先需要先创建一个DefaultHttpClient的实例 HttpClient httpClient=new DefaultHttpClient(); 发送GET请 ...

  8. php的cookie和session相同主域名共享

    如何使用chrome查看cookie和session详见另一篇文章,点这里 首先说cookie, $cookieDomain = '.elf.com'; setcookie('elf', 'im el ...

  9. uc_client是如何与UCenter进行通信的

    以用户登录为例介绍,其它注销,改密码,消息,头像,好友均类同. 从用户xxx在某一应用程序的login.php,输入用户名,密码讲起.先用uc_user_login函数到uc_server验证此用户和 ...

  10. httpclient详细介绍

    1.HttpClient简介 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 ...

随机推荐

  1. 用Python完成根据日期计算是星期几

    import datetime def week(year,month,day): someday=dayetime.date(year,month,day) result={ "0&quo ...

  2. Ubuntu下apt-get与pip安装命令的区别

    在ubuntu服务器下安装包的时候,经常会用到sudo apt-get install 包名 或 sudo pip install 包名,那么两者有什么区别呢? 1.区别pip用来安装来自PyPI(h ...

  3. python基础教程总结15——4 新闻聚合

    NNTP:网络新闻传输协议,Network News Transfer Protocol 目标: 从多种不同的来源收集新闻: 用户可以轻松添加新的新闻来源(甚至是新类型的新闻来源: 程序可以将编译好的 ...

  4. ThinkPHP笔记——开启debug调试模式

    debug+trace模式可以查看开发过程中TP的错误信息,可以更好地帮助开发者debug.但是debug模式的开启还不是简单的在配置文件中中设置就可以的,经过查资料摸索,找到一种有效的方法. 首先在 ...

  5. UVA 1442 Cave 洞穴 (贪心+扫描)

    题意:有一个洞穴,每个位置有一个底的高度p[i],和对应顶的高度s[i],要往里面尽量放燃料,要求燃料不能碰到顶,可以无限接近. 题解:制约燃料储放的就是顶的高度了,分别求出设当前储放位置的向两边的延 ...

  6. javascript报错:ReferenceError: $ is not defined解决办法

    原因很简单,要么是未导入jquery包,要么是导入的顺序不对. 例如,我在制作Chrome扩展程序时,其中的一块代码如下: 然后运行时报上述错误. 解决方法:我们不难发现script位置有问题,因为$ ...

  7. ubuntu 使用apt命令时报错 E: Could not get lock /var/lib/dpkg/lock - open...

    问题描述: 刚刚安装好Ubuntu16.04.使用apt命令时,提示报错信息: abc@pc:~$ sudo apt-get install openssh-server E: Could not g ...

  8. Bootstrap标签页(Tab)插件事件

    事件 下表列出了标签页(Tab)插件中要用到的事件.这些事件可在函数中当钩子使用. 事件 描述 实例 show.bs.tab 该事件在标签页显示时触发,但是必须在新标签页被显示之前.分别使用 even ...

  9. STL之map操作[转]

    转自https://www.cnblogs.com/yutongzhu/p/5884269.html 作者彼得朱 map 是一种有序无重复的关联容器. 关联容器与顺序容器不同,他们的元素是按照关键字来 ...

  10. 【状态压缩dp】1195: [HNOI2006]最短母串

    一个清晰的思路就是状压dp:不过也有AC自动机+BFS的做法 Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T ...