博客系统(其一)
验证码功能:
def get_img(request): import random def get_random_img(): return (random.randint(0,255),random.randint(0,255),random.randint(0,255)) from PIL import Image,ImageDraw,ImageFont img = Image.new("RGB",(270,40),color=get_random_img()) #方式二 # with open('valid_code.png','wb') as f: # img.save(f) # # with open('valid_code.png','rb') as f: # data = f.read() from io import BytesIO draw = ImageDraw.Draw(img) chandan_ttf = ImageFont.truetype("static/font/chandan.ttf",size=32) for i in range(0,5): num = str(random.randint(0,9)) #生成随机数字 upper_alpha = chr(random.randint(65,90)) #生成随机大写字母 low_alpha = chr(random.randint(97,122)) #生成随机小写字母 now_char = random.choice([num,upper_alpha,low_alpha]) #使用随机列表从中选择 draw.text((i*50,5),now_char,get_random_img(),font=chandan_ttf) #draw.text(xy坐标,写的内容text,背景颜色,字体ttf) f = BytesIO() img.save(f,"png") data = f.getvalue() return HttpResponse(data)
储存验证码的值:通过session来储存,这样每个浏览器就会独享一个验证码
request.session['valid_code_str'] = valid_code_str #valid_code_str 为系统随机生成的验证码
这时再在index视图函数中取出该session
valid_code_str = request.session.get('valid_code_str') if valid_code_str.upper() == valid_code.upper(): #不区分大小写 pass else: respon_dic['msg'] = "valid error" return JsonResponse(respon_dic)
JsonResponse:可以帮你序列化
#如果这样返回,ajax还需要进行json解析 #views.py return HttpResponse(json.dumps({"msg":"ok!"})) #index.html var data=json.parse(data)console.log(data.msg); #如果这样返回,两边都不需要进行json的序列化与反序列化,ajax接受的直接是一个对象 #views.py from django.http import JsonResponse return JsonResponse({"msg":"ok!"}) #index.html console.log(data.msg);
当用户选择文件时,选取当前用户的文件对象
$("#avater")[0].files[0]
File(244782) {name: "sedarkwallpaper.srx", lastModified: 1540678438189, lastModifiedDate: Sun Oct 28 2018 06:13:58 GMT+0800 (中国标准时间), webkitRelativePath: "", size: 244782, …}
Media配置:降低耦合性
Django有两种静态文件:
1./static/ :css,js,img
2./media/ 用户上传文件
media配置之MEDI_ROOT
在settings.py 文件里面设置
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
在Django中将会实现:
用户上传的文件将会下载至MEDIA_ROOT的media文件下,如果没有将会自动创建
media 配置之MEDIA_URL
目的是浏览器可以直接访问到media数据
MEDIA_URL = '/media/'
在url.py中再设置:
from django.views.static import serve re_path(r'media/(?P<path>.*)$',serve,{"document_root":settings.MEDIA_ROOT}),
使用Django里面的admin组件创建表:
在admin.py下:
首先是注册,将创建的表往admin里面注册,然后打开http://127.0.0.1:8000/admin,可以查看
from my_blog import models admin.site.register(models.UserInfo) admin.site.register(models.Article) admin.site.register(models.Article2Tag) admin.site.register(models.ArticleUpDown) admin.site.register(models.Category) admin.site.register(models.Blog) admin.site.register(models.Comment) admin.site.register(models.Tag)
vertical-align: -1px; 相对位移
个人站点的日期查询:
1.date_format;
============date,time,datetime================
create table t_mul(d date,t time,dt datetime); //date:年月日;time:时分秒;datetime:年月日时分秒
insert into t_mul values(now(),now(),now());
select date_format(dt,"%Y/%m/%d") from t_mul
2.extra;
extra(self, select=None, where=None, params=None, tables=None,
order_by=None, select_params=None):
参数select
date_list=models.Article.objects.filter(user=user).extra(select={"y_m_date":"date_format(create_time,'%%Y/%%m')"}).values("y_m_date").annotate(c=Count("nid")).values_list("y_m_date","c")
方式二:
# 方式2: # from django.db.models.functions import TruncMonth # # ret=models.Article.objects.filter(user=user).annotate(month=TruncMonth("create_time")).values("month").annotate(c=Count("nid")).values_list("month","c") # print("ret----->",ret)
<scrip>alrent('123')</script>
使用utf-8生成数据库
CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
刪除數據庫
drop database <数据库名>