首先看看博客的整体概貌(因为我也是处在学习阶段,简单的来说就是一个python的业余爱好者,在B站上找的资源学习,学到了很多)
先看主界面(由于我不擅长前端,所以采用的是杨青青里的网页模板,大家可以去百度然后获取资源)
这个是登陆界面,短信验证登陆采用的是网易云信(可以去官网查看)。
注册界面形式上也是类似
邮箱找回密码采用的是网易邮箱结合django中的Api.
写博客就比较的简陋,会前端的人可以把这个变得友好一点。
好丑(你们也可以改好看点)
后台采用的是xadmin(注意版本,2.0版本最好,否则你会难受死),还比较好看,一些属性包括搜索都还不错
主要分为文章模块和用户模块(这个小demo,高手一般一两天就解决了),我用的就比较久(主要是学习一下加上繁忙的课程)
主要代码如下
from captcha.models import CaptchaStore
from django.contrib.auth import logout,login,authenticate
from django.contrib.auth.decorators import login_required
from django.contrib.auth.hashers import make_password
from django.core.mail import send_mail
from django.db.models import Q
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render, redirect
# Create your views here.
from django.urls import reverse
from Pikalong.settings import EMAIL_HOST_USER
from User.forms import UserRegisterForm, RegisterForm, CaptchaTestForm
from User.models import UserProfile
from User.utils import util_sendmsg, send_email, upload_image
from article.models import Article
def index(request):
farticles = Article.objects.all().order_by(('-click_num'))
darticles = Article.objects.all().order_by('-date')[:8]
return render(request, 'index.html', context={'figure_articles':farticles[:3], 'darticles':darticles})
#用户注册
def user_register(request):
if request.method == 'GET':
return render(request, 'register.html')
if request.method == "POST":
username = request.POST.get('username')
mobile = request.POST.get('mobile')
Password = request.POST.get('Password')
email = request.POST.get('email')
users = UserProfile.objects.filter(Q(username=username)|Q(mobile=mobile)).exists()
if users:
# return HttpResponse('注册失败')
return render(request, 'register.html', context={'msg': '注册失败,请重新填写','yes':0})
else:
user = UserProfile()
user.username = username
user.mobile = mobile
user.email = email
user.password = make_password(Password)
user.save()
return render(request, 'register.html', context={'msg': '注册成功,即将跳转到登陆页面', 'yes':1})
def user_login(request):
if request.method == 'GET':
return render(request, 'login.html')
elif request.method == 'POST':
username = request.POST.get('username')
users = UserProfile.objects.filter(username=username)
if users:
password = request.POST.get('password')
#方式一(通用的方式)
# if users.first().check_password(password):
# request.session['username'] = username
# return redirect(reverse('index'))
#
# else:
# return render(request, 'login.html', context={'msg':'密码错误'})
#方式二,前提继承了Abstrack
user = authenticate(username=username, password=password)
if user:
login(request, user) #将用户对象保存在底层的request中
request.session['username'] = username
# return render(request, 0'login.html', context={'msg':'密码错误'})
return redirect(reverse('index'))
else:
return render(request, 'login.html', context={'msg':'密码错误'})
else:
return render(request, 'login.html', context={'msg': '用户名不存在'})
#注销账户
def user_logout(request):
# request.session.flush() #删除了Cookie session 缓存里的信息
#调用函数
logout(request)
return redirect(reverse('index'))
def send_code(request):
mobile = request.GET.get('mobile')
user = UserProfile.objects.filter(mobile=mobile).first()
if user:
json_result = util_sendmsg(mobile)
# 发送验证码,第三方
print(mobile)
status = json_result.get('code')
data = {
'status':200,
'msg':"ok"
}
if status == 200:
check_code = json_result.get('obj')
#使用session保存
request.session[mobile] = check_code
data['status'] = 200
data['msg'] = '验证码发送成功'
else:
data['status'] = 500
data['msg'] = '验证码发送失败'
return JsonResponse(data=data)
else:
data = {
'status':501,
'msg':"用户不存在"
}
return JsonResponse(data=data)
def code_login(request):
if request.method == 'GET':
return render(request, 'codelogin.html')
elif request.method == 'POST':
mobile = request.POST.get('rp_mobile')
code = request.POST.get('code')
#根据mobile去session取值
check_code = request.session.get(mobile)
if code == check_code:
user = UserProfile.objects.filter(mobile=mobile).first()
if user:
login(request, user)
# request.session['username'] = user.username
return redirect(reverse('index'))
else:
return render(request, 'codelogin.html', context={'msg':'验证码输入有误'})
def forget_password(request):
if request.method == 'GET':
form = CaptchaTestForm()
return render(request, 'forget_pwd.html', context={'form':form})
elif request.method =='POST':
#获取提交的邮箱, 发送邮箱,通过发送的邮箱设置新的密码
email = request.POST.get('email')
#给此邮箱地址发送邮件
result =send_email(email, request)
print(result)
print("=" *100)
if result == 2:
render(result, 'update_pwd.html', context={"check":'用户名不存在'})
if result:
render(result, 'update_pwd.html', context={"check":'验证信息已发送至您的邮箱'})
else:
render(result, 'update_pwd.html', context={"check":'验证信息发送失败,请稍后再试'})
#更新密码
def update_pwd(request):
if request.method == 'GET':
c = request.GET.get('c')
return render(request, 'update_pwd.html',context={'c':c})
elif request.method == 'POST':
code = request.POST.get('code')
uid = request.session.get(code)
user = UserProfile.objects.get(pk=uid)
pwd = request.POST.get('password')
repwd = request.POST.get('rpassword')
if pwd == repwd and user:
pwd = make_password(pwd)
user.password = pwd
user.save()
# request.session.flush()
return render(request, 'update_pwd.html',context={'msg':'用户名密码更新成功!'})
else:
return render(request, 'update_pwd.html', context={'msg': '更新失败'})
#定义一个路由验证码
def valide_code(request):
if request.is_ajax():
key = request.GET.get('key')
code = request.GET.get('code')
captche = CaptchaStore.objects.filter(hashkey=key).first()
data = {}
if captche.response==code.lower():
#正确
data['status'] = 1
print(data)
return JsonResponse(data=data)
else:
#错误
data['status'] = 0
print(data)
return JsonResponse(data=data)
# @login_required #login(request, user) user-->继承Abstract
# def user_center(request):
# user = request.user
# if request.method == 'GET':
# return render(request,'center.html', context={'user':user})
# elif request.method == 'POST':
# username = request.POST.get('username')
# email = request.POST.get('email')
# mobile = request.POST.get('mobile')
# icon = request.FILES.get('icon') #获得的只是图片的二进制信息
# name = icon.name
# user.username = username
# user.email = email
# user.mobile = mobile
# user.icon = icon #利用插件直接就可以保存
# user.save()
#
# return render(request, 'center.html', context={'user': user})
#
#图片上传到云
@login_required
def user_center(request):
user = request.user
if request.method == 'GET':
return render(request, 'center.html', context={'user': user})
elif request.method == 'POST':
username = request.POST.get('username')
email = request.POST.get('email')
mobile = request.POST.get('mobile')
icon = request.FILES.get('icon') # 获得的只是图片的二进制信息
name = icon.name
user.username = username
user.email = email
user.mobile = mobile
# user.icon = icon # 利用插件直接就可以保存
#上传到七牛云
save_path = upload_image(icon)
user.yunicon = save_path
user.save()
return render(request, 'center.html', context={'user': user})
from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator
from django.http import HttpResponse
from django.shortcuts import render, redirect
# Create your views here.
#文章详情
from django.urls import reverse
from article.forms import ArticleForm
from article.models import Article, Tag
#文章详情
def article_detail(request):
id = request.GET.get('id')
article = Article.objects.get(pk=id)
article.click_num += 1
article.save()
#查询相关文章
tags_list = article.tags.all()
list_about = []
for tag in tags_list:
for article in tag.article_set.all():
if article not in list_about and len(list_about) < 6:
list_about.append(article)
return render(request,'info.html', context={'article':article,'list_about':list_about})
#学无止境
def article_show(request):
tags = Tag.objects.all()[:6]
tid = request.GET.get('tid','')
if tid:
tag = Tag.objects.get(pk=tid)
articles = tag.article_set.all()
else:
articles = Article.objects.all()
paginator = Paginator(articles, 1) #Paginator(对象列表, 几条记录)
page = request.GET.get('page', 12) #返回的是page对象
page = paginator.get_page(page)
# page.has_next() #有没有下一页
# page.has_previous() #判断是否存在前一页
# page.next_page_number() #获取下一页的页码数
# page.previous_page_number() #获取前一页的页码数、
#属性 object_list 当前页的所有对象
# number 当前的页码数
# paginator 分页器对象
return render(request, 'learn.html', context={'page':page, 'tags':tags, 'tid':tid})
@login_required
def wricte_article(request):
if request.method == 'GET':
aform = ArticleForm()
return render(request, 'write.html', context={'aform':aform})
else:
aform = ArticleForm(request.POST)
print(aform)
if aform.is_valid():
print('----------->校验成功')
data = aform.cleaned_data
article = Article()
article.title = data.get('title')
article.desc = data.get('desc')
article.content = data.get('content')
article.image = data.get('image')
article.user = data.get('user')
article.save()
article.tags.set(data.get('tags'))
#多对多 必须添加到文章保存的后面
return redirect(reverse('index'))
else:
print("失败")
return HttpResponse('asd')
链接如下
链接:https://pan.baidu.com/s/1pVN2BhpItbLIQtJWcHenBA
提取码:qyla
复制这段内容后打开百度网盘手机App,操作更方便哦
点我直接打开