最新版本:Python个人博客系统django源代码,个人网站系统源程序

优采云 发布时间: 2022-11-19 03:56

  最新版本:Python个人博客系统django源代码,个人网站系统源程序

  Python 个人博客系统 django 源代码,

  个人网站系统源代码,基于 Django + MySQL

  如何使用:

  1、pip安装-r要求.txt、安装程序相关依赖

  2. 在 MySQL 中创建一个 youngBlog 数据库,导入 youngBlog .sql,并在 youngBlog/settins .py中修改 DATABASES 设置

  3. manage.py 创建超级用户,创建超级管理员,根据提示输入用户名、邮箱和密码

  4.manage.py 运行服务器启动程序,打开:8000/,后台:8000/登录

  完整的程序代码下载地址:Python个人博客系统django源代码,个人网站系统源程序

  setting.py

  """

Django settings for youngBlog project.

Generated by 'django-admin startproject' using Django 3.1.

For more information on this file, see

https://docs.djangoproject.com/en/3.1/topics/settings/

For the full list of settings and their values, see

https://docs.djangoproject.com/en/3.1/ref/settings/

"""

import os

from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.

BASE_DIR = Path(__file__).resolve(strict=True).parent.parent

# Quick-start development settings - unsuitable for production

# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!

SECRET_KEY = '7x5+6(&)#fffqog%$6zz*njxxo#e&b%pexr^^ij5@cjm7ja4%&'

# SECURITY WARNING: don't run with debug turned on in production!

DEBUG = True

ALLOWED_HOSTS = ['*']

# Application definition

INSTALLED_APPS = [

'django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

'myBlog.apps.MyblogConfig', #或者 myBlog

'captcha',

]

MIDDLEWARE = [

'django.middleware.security.SecurityMiddleware',

'django.contrib.sessions.middleware.SessionMiddleware',

'django.middleware.common.CommonMiddleware',

'django.middleware.csrf.CsrfViewMiddleware',

'django.contrib.auth.middleware.AuthenticationMiddleware',

'django.contrib.messages.middleware.MessageMiddleware',

'django.middleware.clickjacking.XFrameOptionsMiddleware',

]

ROOT_URLCONF = 'youngBlog.urls'

AUTH_USER_MODEL = "myBlog.User_admin"

TEMPLATES = [

{

'BACKEND': 'django.template.backends.django.DjangoTemplates',

'DIRS': [os.path.join(BASE_DIR, 'templates')]

,

'APP_DIRS': True,

'OPTIONS': {

'context_processors': [

'django.template.context_processors.debug',

'django.template.context_processors.request',

'django.contrib.auth.context_processors.auth',

'django.contrib.messages.context_processors.messages',

],

},

},

]

WSGI_APPLICATION = 'youngBlog.wsgi.application'

# Database

# https://docs.djangoproject.com/en/3.1/ref/settings/#databases

DATABASES = {

'default': {

'ENGINE': 'django.db.backends.mysql',

'NAME': 'youngBlog',

'USER': 'root',

'PASSWORD': 'sxing86',

'HOST': 'localhost',

'PORT': '3306',

}

}

# Password validation

# https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [

{

'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',

},

{

'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',

},

{

'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',

},

{

'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',

},

]

# Internationalization

# https://docs.djangoproject.com/en/3.1/topics/i18n/

LANGUAGE_CODE = 'zh-Hans'

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = False #

# Static files (CSS, JavaScript, Images)

# https://docs.djangoproject.com/en/3.1/howto/static-files/

STATIC_URL = '/static/'

# 用于部署打包静态文件

STATIC_ROOT = os.path.join(BASE_DIR, 'collected_static')

# 静态文件地址拼接,后面'static'文件为自己建立的存放静态文件(JS,IMG,CSS)的文件名

STATICFILES_DIRS = (

os.path.join(BASE_DIR, 'static'), # 主文件下静态文件

)

# 添加以下代码以后就不用写{% load staticfiles %},可以直接引用

STATICFILES_FINDERS = (

"django.contrib.staticfiles.finders.FileSystemFinder",

"django.contrib.staticfiles.finders.AppDirectoriesFinder"

)

#媒体文件

MEDIA_URL = '/media/'

MEDIA_ROOT = os.path.join(BASE_DIR,"media")

#验证码的配置

CAPTCHA_OUTPUT_FORMAT = '%(image)s %(text_field)s %(hidden_field)s '

CAPTCHA_NOISE_FUNCTIONS = ('captcha.helpers.noise_null', # 没有样式

# 'captcha.helpers.noise_arcs', # 线

# 'captcha.helpers.noise_dots', # 点

)

# 图片中的文字为随机英文字母,如 mdsh

# CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.random_char_challenge'

# 图片中的文字为数字表达式,如2+2=

CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.math_challenge'

# 超时(minutes)

CAPTCHA_TIMEOUT = 1

<p>

</p>

  view.py

  import datetime

import json

import uuid

from captcha.helpers import captcha_image_url

from captcha.models import CaptchaStore

from django.core import serializers

from django.core.paginator import Paginator

from django.http import JsonResponse

from django.shortcuts import render,redirect

from django.views import View

from django.contrib.auth.hashers import check_password,make_password

from myBlog.form import *

from myBlog.models import *

from django.contrib.auth import login

from django.contrib.auth.mixins import LoginRequiredMixin

class Login(View):

def get(self,request):

hashkey = CaptchaStore.generate_key()

image_url = captcha_image_url(hashkey)

login_form = UserForm()

return render(request,&#39;login.html&#39;,locals())

def post(self,request):

yzm = request.POST.get(&#39;captcha&#39;, &#39;&#39;)

hashkey = request.POST.get(&#39;code&#39;)

# 根据key获取验证码对象

cap = CaptchaStore.objects.filter(hashkey=hashkey).first()

if cap: # 存在

if cap.response == yzm.lower():

login_form = UserForm(request.POST)

if login_form.is_valid():

username = login_form.cleaned_data.get(&#39;username&#39;)

password = login_form.cleaned_data.get(&#39;password&#39;)

try:

user = User_admin.objects.get(username=username)

except:

message = &#39;用户不存在!&#39;

return redirect(&#39;/login/&#39;)

#使用django自带的密码验证

if check_password(password, user.password):

login(request, user)

return redirect(&#39;/admin/&#39;)

else:

message = &#39;密码不正确!&#39;

return redirect(&#39;/login/&#39;)

else:

return redirect(&#39;/login/&#39;)

else:

message = &#39;验证码无效!&#39;

return redirect(&#39;/login/&#39;)

#登出

from django.contrib.auth import logout

class Loginout(View):

def get(self,request):

logout(request)

return redirect(&#39;/login/&#39;)

#后台

class Admin(LoginRequiredMixin,View):

login_url = &#39;/login/&#39;

redirect_field_name = &#39;redirect_to&#39;

def get(self,request):

username = request.user

users = User_admin.objects.filter(username=username).values(&#39;nickName&#39;,&#39;username&#39;).first()

return render(request,&#39;index.html&#39;,{"users":users})

#首页

class Welcome(LoginRequiredMixin,View):

login_url = &#39;/login/&#39;

redirect_field_name = &#39;redirect_to&#39;

def get(self,request):

return render(request,&#39;welcome.html&#39;)

#文章添加

class ArticleOpt(LoginRequiredMixin,View):

login_url = &#39;/login/&#39;

redirect_field_name = &#39;redirect_to&#39;

def get(self, request):

id = request.GET.get(&#39;id&#39;,&#39;&#39;)

if id == &#39;&#39;:

return render(request, &#39;article-add.html&#39;)

else:

ArticleData = Article.objects.filter(id=id).first()

return render(request, &#39;article-add.html&#39;,{&#39;ArticleData&#39;:ArticleData})

def post(self, request):

id = request.POST.get(&#39;id&#39;,&#39;&#39;)

title = request.POST.get(&#39;title&#39;)

tag = request.POST.get(&#39;tag&#39;)

classify_id = request.POST.get(&#39;classify_id&#39;)

content = request.POST.get(&#39;content&#39;)

status = request.POST.get(&#39;status&#39;)

isdelete = request.POST.get(&#39;isdelete&#39;,False)

if id =="":

instance = Article.objects.create(id=uuid.uuid4(),title=title,tag=tag,classify_id=classify_id,content=content,status=int(status))

instance.save()

Result = {

"code": 2000,

"msg": "添加成功",

"count": 0,

"data": ""

}

else:

if isdelete:

Article.objects.filter(id=id).delete()

Result = {

"code": 2000,

"msg": "删除成功",

"count": 0,

"data": ""

}

else:

Article.objects.filter(id=id).update(title=title, tag=tag, classify_id=classify_id, content=content,

status=int(status))

Result = {

"code": 2000,

"msg": "修改成功",

"count": 0,

"data": ""

}

return JsonResponse(Result)

#文章列表

class ArticleList(LoginRequiredMixin,View):

login_url = &#39;/login/&#39;

redirect_field_name = &#39;redirect_to&#39;

def get(self,request):

return render(request,&#39;article-list.html&#39;)

def post(self,request):

reqData = request.POST

pageIndex = reqData.get(&#39;pageIndex&#39;, 1)

pageSize = reqData.get(&#39;pageSize&#39;, 10)

lists = Article.objects.all()

title = reqData.get(&#39;title&#39;,None)

status = reqData.get(&#39;status&#39;,None)

updateTime = reqData.get(&#39;updateTime&#39;,None)

if title !="":

lists = Article.objects.filter(title__icontains=title)

if status !="":

lists = Article.objects.filter(status=int(status))

if updateTime !="":

updateTime = updateTime.split(&#39;,&#39;)

start = datetime.datetime.strptime(updateTime[0][:19],&#39;%Y-%m-%d %H:%M:%S&#39;)

end = datetime.datetime.strptime(updateTime[1][1:20],&#39;%Y-%m-%d %H:%M:%S&#39;) + datetime.timedelta(days=1).strftime("%Y-%m-%d %H:%M:%S")

lists = Article.objects.filter(updateTime__gte=start,updateTime__lte=end)

pageInator = Paginator(lists, pageSize)

contacts = pageInator.page(pageIndex)

json_data = serializers.serialize("json", contacts,fields=(&#39;title&#39;,&#39;tag&#39;,&#39;status&#39;,&#39;createTime&#39;,&#39;updateTime&#39;,))

Result = {

"code": 2000,

"msg": "成功",

"count": len(lists),

"data": json.loads(json_data)

}

return JsonResponse(Result)

from django.utils.decorators import method_decorator

from django.views.decorators.csrf import csrf_exempt

#图片上传

class Upload_img(View):

<p>

@method_decorator(csrf_exempt)

def dispatch(self, request, *args, **kwargs):

return super().dispatch(request, *args, **kwargs)

def get(self,request):

data ={

"success": 0, # 0 表示上传失败,1 表示上传成功

"message": "上传失败。",

"url": "" # 上传成功时才返回

}

return JsonResponse(data)

def post(self,request):

imgs = request.FILES.get(&#39;editormd-image-file&#39;)

name = str(imgs).split(&#39;.&#39;)[0]

data = {

"name": name,

"editormdImageFile": imgs

}

form = UploadFileForm(request.POST, data)

if form.is_valid():

instance = Imgs(name=name,url=request.FILES[&#39;editormd-image-file&#39;]) #保存文件到FileField域

instance.save()

if instance.url != None:

data = {

"success": 1, # 0 表示上传失败,1 表示上传成功

"message": "上传成功",

"url": "/media/" + str(instance.url) # 上传成功时才返回

}

else:

data = {

"success": 0, # 0 表示上传失败,1 表示上传成功

"message": "上传失败",

"url": "" # 上传成功时才返回

}

else:

data = {

"success": 0, # 0 表示上传失败,1 表示上传成功

"message": "上传失败。",

"url": "" # 上传成功时才返回

}

return JsonResponse(data)

#分类添加

class ClassifyAdd(LoginRequiredMixin,View):

login_url = &#39;/login/&#39;

redirect_field_name = &#39;redirect_to&#39;

def get(self,request):

id = request.GET.get(&#39;id&#39;, &#39;&#39;)

if id == &#39;&#39;:

return render(request, &#39;classify-add.html&#39;)

else:

ClassifyData = Classify.objects.filter(id=id).first()

return render(request, &#39;classify-add.html&#39;, {&#39;Data&#39;: ClassifyData})

def post(self,request):

id = request.POST.get(&#39;id&#39;, &#39;&#39;)

name = request.POST.get(&#39;name&#39;)

isdelete = request.POST.get(&#39;isdelete&#39;, False)

if id == "":

instance = Classify.objects.create(id=uuid.uuid4(), name=name)

instance.save()

Result = {

"code": 2000,

"msg": "添加成功",

"count": 0,

"data": ""

}

else:

if isdelete:

Classify.objects.filter(id=id).delete()

Result = {

"code": 2000,

"msg": "删除成功",

"count": 0,

"data": ""

}

else:

Classify.objects.filter(id=id).update(name=name)

Result = {

"code": 2000,

"msg": "修改成功",

"count": 0,

"data": ""

}

return JsonResponse(Result)

#分类获取

class ClassifyList(View):

def get(self,request):

return render(request,&#39;classify.html&#39;)

def post(self,request):

reqData = request.POST

pageIndex = reqData.get(&#39;pageIndex&#39;,1)

pageSize = reqData.get(&#39;pageSize&#39;,10)

name = reqData.get(&#39;name&#39;,&#39;&#39;)

if name !="":

lists = Classify.objects.filter(name__icontains=name)

else:

lists = Classify.objects.all()

pageInator = Paginator(lists, pageSize)

contacts = pageInator.page(pageIndex)

json_data = serializers.serialize("json", contacts)

Result = {

"code": 2000,

"msg": "成功",

"count": len(lists),

"data": json.loads(json_data)

}

return JsonResponse(Result)

#前端文章获取

class MyArticle(View):

def get(self,request):

id = request.GET.get(&#39;id&#39;,None)

classify_id = request.GET.get(&#39;classify_id&#39;,None)

if id is None:

if classify_id is None:

ArticleList = Article.objects.filter(status=1).all()

else:

ArticleList = Article.objects.filter(status=1,classify_id = classify_id).all()

pageIndex = request.GET.get(&#39;pageIndex&#39;, 1)

pageSize = request.GET.get(&#39;pageSize&#39;, 5)

pageInator = Paginator(ArticleList, pageSize)

contacts = pageInator.page(pageIndex)

return render(request,&#39;frontEnd/index.html&#39;,{&#39;ArticleList&#39;:contacts,&#39;CountList&#39;:ArticleList.count()})

else:

ArticleList = Article.objects.filter(id=id).first()

return render(request, &#39;frontEnd/travel.html&#39;, {&#39;ArticleList&#39;: ArticleList})

#修改密码

class UpdatePwd(LoginRequiredMixin,View):

login_url = &#39;/login/&#39;

redirect_field_name = &#39;redirect_to&#39;

def get(self,request):

username = request.user

return render(request,&#39;change-password.html&#39;,{"username":username})

def post(self,request):

reqData = request.POST

oldpwd = reqData.get(&#39;oldpassword&#39;)

newpwd = reqData.get(&#39;newpassword&#39;)

user = User_admin.objects.filter(username=request.user).first()

Result = dict()

if check_password(oldpwd, user.password):

User_admin.objects.filter(username=request.user).update(password=make_password(newpwd))

Result = {

"code": 2000,

"msg": "成功",

"count": 0,

"data": ""

}

else:

Result = {

"code": 2001,

"msg": "旧密码不正确",

"count": 0,

"data": ""

}

return JsonResponse(Result)

</p>

  完整的程序代码下载地址:Python个人博客系统django源代码,个人网站系统源程序

  技巧:VuePress 博客之 SEO 优化(六)站长工具

  前言

  在《一篇带你用VuePress + Github Pages搭建博客》[1]中,我们使用VuePress搭建了一个博客。查看最终效果:TypeScript中文文档[2]。

  本文接着说说SEO优化会用到的站长平台和工具。

  1.百度统计

  地址:[3]

  网站流量分析工具,告诉用户访问者如何找到和浏览网站,他们在网站上做了什么

  2.百度搜索资源平台

  地址:#/[4]

  添加站点后,您可以在百度搜索结果中看到您的站点的一些表现:

  百度搜索中心也提供一些教程如:

  

  《平台工具手册》:[5]《百度搜索引擎优化指南2.0》[6] 3.Google Analytics

  类似百度统计,地址:[7]

  Google Analytics是著名互联网公司Google为网站提供的数据统计服务。可以对目标网站进行访问数据统计和分析,并提供各种参数供网站拥有者使用。

  4.谷歌搜索控制台

  类似百度搜索资源平台,地址:[8]

  Google Search Console 是 Google 提供的一项免费服务,可帮助您监控、维护您的 网站 在 Google 搜索结果中的显示情况并进行故障排除。

  5.谷歌搜索中心

  Google 搜索中心(以前称为“Google 网站Webmaster”)旨在帮助感兴趣的用户发现和查看您的内容,并提供一些提示来帮助您 网站 被 Google 搜索资源找到。

  我们可以在这里学习 SEO 的技巧:[9]

  6. 谷歌趋势

  地址:[10]

  谷歌趋势是谷歌推出的基于搜索数据的分析工具。它每天分析谷歌搜索引擎数十亿条搜索数据,告诉用户某个关键词或主题在各个时期在谷歌搜索引擎中显示的频率和相关统计数据。

  

  7. 站长工具

  顾名思义,站长工具集,地址:[11]

  如图所示,可以进行SEO综合查询、权重查询、友情链接检测、相关历史数据查询、关键词挖掘、死链接检测[12]等功能。

  例如SEO综合查询可以在各大搜索引擎中找到关于网站的信息,如网站权重、预估流量、收录、反链接、关键词排名等.

  8.ahrefs

  类似站长工具,但不是国外的,地址:[13]

  9. 5118

  挖矿 关键词,地址:[14]

  5118提供关键词挖掘、行业词库、站群权重监控、关键词排名监控、索引词、流量词挖掘工具等准备百度站长工具平台

  系列 文章

  博客搭建系列,讲解如何使用VuePress搭建博客并部署到GitHub、Gitee、个人服务器等平台。估计会有20篇左右,这篇是第32篇。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线