BBS(第二天) Django之Admin 自动化管理数据页面 与创建一个用户注册的验证码
1.admin的概念
# Admin是Django自带的一个功能强大的自动化数据管理界面
# 被授权的用户可以直接在Admin中操作数据库
# Django提供了许多针对Admin的定制功能
2. 配置并管理自动化界面
# 终端项目目录创建一个超级用户:python3 manage.py createsuperuser
# eg:Username:root | Email:root@root.com | Password:1234qwer
# 浏览器Admin入口:http://127.0.0.1:8000/admin
# 设置Admin界面为中文环境:项目下settings.py,LANGUAGE_CODE = 'zh-Hans'
# 简体:zh-hans | 繁体:zh-hant | 美式英语:en-us
3. 把数据库的表自动注册到admin 界面内
from django.contrib import admin # Register your models here. from blog.models import * admin.site.register(User)
admin.site.register(Blog)
admin.site.register(Article)
admin.site.register(Category)
admin.site.register(Tag)
admin.site.register(UpOrDown)
admin.site.register(Comment)
4. 自定义显示字段名与表名:
# 为应用下models.py映射关系类重写__str__方法
class Article(models.Model):
title = models.CharField(max_length=32, default='Title', verbose_name="标题")
content = models.TextField(null=True, verbose_name="内容", blank=True)
# 重写__str__方法,格式化该类实例对象的表示方式
def __str__(self):
return self.title
class Meta:
verbose_name = "文章"
verbose_name_plural = verbose_name
如何创建一个验证码给用户注册的时候使用
from django.shortcuts import render, HttpResponse from django.http import JsonResponse
from blog.checks import check_name, CheckForm
from blog.models import User from django.contrib.auth import authenticate, login # 安装Pillow模块
# 生成图片(画板)、字体(选择指定ttf并设置字体)、画笔(画点、线、字、圆)
from PIL import Image, ImageFont, ImageDraw
from io import BytesIO
import random # 定义接口规范
response_dic = {
'statue': 1,
'msg': 'ok',
'data': {}
} # 创建画板,保存在服务器本地
def save_local():
img = Image.new('RGB', (230, 32), (40, 20, 10)) # type: Image
# 本地写流
wf = open('code.png', 'wb')
# 将数据以指定格式丢给文件操作流
img.save(wf, 'png') with open('code.png', 'rb') as f:
data = f.read()
return data
创建画板,保存在服务器本地
# 随机RGB元组
def random_RGB(min, max):
return tuple([random.randint(min, max) for i in range(3)]) # 随机产生六位验证码
def random_six_code():
code = ""
# 每一位均可以为字母大写、小写或数字
for i in range(6):
tag = random.randint(1, 3) # 1:大写 2:小写 3:数字
if tag == 1:
code += chr(random.randint(65, 90))
elif tag == 2:
code += chr(random.randint(97, 122))
else:
code += str(random.randint(0, 9))
return code
随机产生六位数的验证码
# 获取验证码
def login_code(request):
# data = save_local() img = Image.new('RGB', (230, 32), random_RGB(150, 255)) # 在画板中画字
img_draw = ImageDraw.Draw(img) # 设置ImageFont字体
img_font = ImageFont.truetype('static/font/kumo.ttf', size=30) # 获取六位验证码
img_code = random_six_code()
# 将img_code存储到session中,与会话绑定,用来完成登录验证码的验证
request.session['img_code'] = img_code # 画文字:xy轴、文本、颜色、ImageFont字体
for i, ch in enumerate(img_code):
img_draw.text((30 + i * 30, 0), ch, random_RGB(0, 150), img_font) bf = BytesIO()
img.save(bf, 'png')
data = bf.getvalue() # 从内存中将数据全部取出
return HttpResponse(data)
获取验证码
# 登录
def my_login(request):
if request.method == "GET":
return render(request, 'login.html')
if request.method == "POST":
client_code = request.POST.get('img_code', None).lower()
server_code = request.session.get('img_code', None).lower()
print("client_code", client_code)
print("server_code", server_code)
if client_code != server_code:
return JsonResponse({
'statue': 2,
'msg': "验证码错误",
'data': {}
})
# 验证通过就可以进行用户登录
username = request.POST.get('username', None)
password = request.POST.get('password', None)
user = authenticate(username=username, password=password)
if user:
login(request, user)
return JsonResponse({
'statue': 1,
'msg': "登录成功",
'data': {}
})
return JsonResponse({
'statue': 2,
'msg': "登录失败",
'data': {}
})
login方法+判断验证码是否正确
from django.conf.urls import url
from django.contrib import admin
from blog import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', views.my_login), url(r'^register/$', views.register),
url(r'^check_username/$', views.check_username), url(r'^my_login/$', views.my_login),
# 获取验证码的GET请求
url(r'^login_code/$', views.login_code),
]
在url内设置好验证码的路径,方便ajax调用
<script>
$(".login").click(function () {
token = $('[name=csrfmiddlewaretoken]').val(); $.ajax({
url: '/my_login/',
type: 'post',
data: {
{#csrfmiddlewaretoken: '{{ csrf_token }}',#}
csrfmiddlewaretoken: token,
username: $('#username').val(),
password: $('#password').val(),
img_code: $('#img_code').val(),
},
success: function (data) {
console.log(data);
$("#login-info").modal('show');
$('#myModalLabel').text(data.msg)
} })
}) $('#code').click(function () {
{#var _this = this;#}
{#$.ajax({#}
{# url: '/login_code/',#}
{# success: function (data) {#}
{# console.log(data);#}
{# $(_this).attr('src', data)#}
{# }#}
{# })#} url = '/login_code/'; var xhr = new XMLHttpRequest();
xhr.open('GET', url, true); // url
xhr.responseType = "blob";
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
var blod = this.response;
var src = URL.createObjectURL(blod); // src
$('#code').attr('src', src);
}
}
};
xhr.send(); }) </script>
前端ajax识别验证码的方法
BBS(第二天) Django之Admin 自动化管理数据页面 与创建一个用户注册的验证码的更多相关文章
- Django之admin中管理models中的表格
Django之admin中管理models中的表格 django中使用admin管理models中的表格时,如何将表格注册到admin中呢? 具体操作就是在项目文件夹中的app文件夹中的admin中注 ...
- Django的Admin站点管理
一.概述 内容发布:负责添加.修改.删除内容 公告访问 二.配置Admin应用 在settings.py文件中的INSTALLED_APPS中添加'django.contrib.admin',默认是添 ...
- django的admin后台管理
Admin后台管理 要进入admin后台管理首先要创建管理员账户 createsuperuser 其中密码要大于8位 使用之前要到应用下的admin.py中注册要管理的模型表 from django. ...
- Django框架admin后台管理和用户端静态文件
目录 一.admin后台管理 1. 如何使用 2. 路由分发的本质 二.用户上传的静态文件的展示 1. media配置 2. 手动开设media接口 三.图片防盗链 一.admin后台管理 djang ...
- django的admin后台管理如何更改为中文
新建Django的admin后端控制为英文显示,为了可以使其显示中文,可以将 setting.py配置文件修改 # LANGUAGE_CODE = 'en-us' # # # # # TIME_ZON ...
- django学习-22.admi管理后台页面的文案展示等相关配置
目录结果 1.前言 2.完整的操作步骤 2.1.第一步:对[settings.py]里的相关常量的值做如下修改 2.2.第二步:重启django项目[helloworld]的服务 2.3.第三步:重新 ...
- django 之admin后台管理
数据库 from django.db import models from django.contrib.auth.models import User from django.contrib.aut ...
- 使用django的admin的后台管理界面
django的admin后台管理界面是方便我们对数据库操作的 是一个在浏览器显示的 图形化界面数据库操作 我们先在django中的admin中把我们需要在图形化界面中进行操作的表导入进去: 先把m ...
- IO操作、PIL使用、Django的admin操作
操作内存的流-StringIO | BytesIO from io import StringIO, BytesIO #创建操作字符串的内存流 sf = StringsIO() #往内存中写 sf.w ...
随机推荐
- [Java复习] 复习知识点
将线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现. String 被设计成不可变(immutable)类, 所以它的所有对象都是不可变对象. 要被序列化的实例 ...
- 非常好的开源C项目tinyhttpd(500行代码)
编译命令 gcc -W -Wall -lpthread -o httpd httpd.c 源码 #include <stdio.h> #include <sys/socket.h&g ...
- 《Linux内核原理与分析》第七周作业
课本:第六章 进程的描述和进程的创建 操作系统内核实现操作系统的三大管理功能 进程管理 内存管理 文件系统 在操作系统原理中,通过进程控制块PCB描述进程:在Linux内核中,通过一个数据结构stru ...
- 浏览器执行代码 是jsp 服务端执行的是<%%>
接着上一个视频,想使得注销页面有一个很好的效果,那到底能不能再首页页面的<head>标签里写如下代码呢? 答案是肯定不行的.看执行以后的效果,执行之后,看到的网页源代码,如下图所示,造成这 ...
- Centos7.4安装配置haproxy和Keepalived
系统版本是centos7.4的 [root@data-1-1 ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [roo ...
- yuan先生博客链接
Yuan先生的博客网址 1 Web应用 https://www.cnblogs.com/yuanchenqi/articles/8869302.html 2 http协议 https://www ...
- 第一个Python小项目:图片转换成字符图片
实现的效果: ...
- Illegalmixofcollations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT)foroperation '= 连表查询排序规则问题
两张 表 关联 ,如果 join的字段 排序规则 不一样就会出这个问题 . 解决办法 ,统一 排序规则. 在说说区别,utf8mb4_general_ci 更加快,但是在遇到某些特殊语言或者字符集,排 ...
- [转]Linux下Python与C++混合编程
转自:http://www.cnblogs.com/tevic/p/3645197.html 最近在做一个CUDA的项目,记录下学习心得. 系统 Linux 3.11.0-19-generic #33 ...
- 3.STM32复位系统
一.概念 复位: 使系统结束当前运行状态,重新开始运行,并根据复位种类,将系统的寄存器(特定的寄存器除外)恢复到默认状态. 二.复位的种类 1.系统复位 将除了系统后备区域寄存器(BKP)和时钟控制寄 ...