Python之Django博客小项目
迪丽瓦拉
2024-05-31 16:34:01
0

文章目录

    • 项目1 :博客项目
      • 1.首页展示
      • 2.帖子分类
      • 3.帖子归档
      • 4.近期文章(见上)
        • django缓存:
        • Redis:
      • 5.关于博主
      • 6.全文搜索
        • 中文分词:
      • 7.发布帖子(admin中)
      • 8.部署
      • 附加:Git
        • 常用命令:
        • 分支操作
        • 远程库和本地库

项目1 :博客项目

python manage.py startapp post #
urlpatterns =[url(r'^admin/',admin.site.urls),url(r'^', include('post.urls')),
]
#coding=utf-8
from django.conf.urls import url
import views
urlpatterns=[url(r'^$',views.queryAll)
]

1.首页展示

# create your views here.
#演染主页面
def queryAll(request):return render(request,'index.htm1')
{% extends 'base.html' %}
{% block title %}首页{% endblock %}
{% block headerjs %}form {position: relative ;width: 150px; margin: 0 auto;}.d1{float: right;line-height: 67px;}.d1 input {width: 100px; height: 30px;border: 2px solid darkred;border-radius: 5px;outline: none ;background: white;color: #1e242a;}
{% endblock %}
{% block left%}
 
{% endblock %}		
# Create your models here.
class category(models.Model):cname = models.CharField(max_length=30, unique=True)class Meta: db_table = 't_category'def __unicode__(self):return u'Category:%s'%self.cnameclass Tag( models. Model):tname = models.CharField(max_length= 30, unique=True)class Meta: db_table = 't_tag'def __unicode__(self):return u'Tag:%s'%self.tnameclass Post(models.Model):title = models.CharField(max_length=100, unique=True)desc = models.CharField(max_length=100)content = models.TextField()created = models.DateTimeField(auto_now_add=True)category = models.ForeignKey(Category,on_delete=models.CASCADE)tag = models.ManyToManyField(Tag)class Meta: db_table = 't_post'def __unicode__(self):return u'Post:%s'%self.title
# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
DATABASES = {'default': {'ENGINE' :‘django.db.backends.mysq1','NAME':'180810db','USER' : 'root','PASSWORD' :'123456''HOST' :'127.0.0.1','PORT' :'3306',}
}
python manage.py makemigrations post
from .models import *
# Register your models here.
admin.site.register(Category)|
admin.site.register(Tag)
admin.site.register(Post)
python manage.py createsuperuser
LANGUAGE_CODE ='zh-Hans'
TIME_ZONE ='Asia/Shanghai'
class Meta:db_table = 't_category'verbose_name_plural=u'类别'
# __init.py__
from django.apps import AppConfig
import os
default_app_config = 'post.PrimaryBlogConfig'
VERBOSE_APP_NAME=u"博客管理"def get_current_app_name(_file):return os.path.split(os.path.dirname(_file))[-1]class PrimaryBlogConfig(AppConfig):name = get_current_app_name(__file__)verbose_name = VERBOSE_APP_NAME
cname= models.CharField(max_length=30, unique=True, verbose_name=u"类别名称" )
from .models import *
# Register your models here.
class PostModelAdmin(admin.ModelAdmin):list_display =('title','created')admin.site.register(Category)|
admin.site.register(Tag)
admin.site.register(Post,, PostModelAdmin)
def queryAll (request):#获取所有帖子信息postlist = Post.objects.all().order_by('-created')return render(request, 'index.html',{'postlist':postlist})
{% for post in postList %}<%endfor%>
# 分页
#演染主页面
from post.models import Post
from django.core.paginator import Paginator
def queryAll (request,num=1):# num = request.GET.get('num' ,1)num = int(num)#获取所有帖子信息postlist = Post.objects.all().order_by('-created')# 创建分页器对象pageObj = Paginator(postList,1)#获取当前页的数据perPagelist = pageObj.page(num)#生成页码数列表#每页开始页码begin = (num - int(math.ceil(10.0 / 2)))if begin < 1:begin = 1#每页结束页码end=begin+9if end > pageObj.num_pages:end = pageObj.num_pagesif end <= 10:begin = 1else:begin=end-9pagelist = range(begin, end + 1)return render(request, 'index.html',{'postList':perPagelist,'pageList':pagelist,'currentPage':num})
urlpatterns=[url(r'^$',views.aueryAll),url(r'^page/(d+)$',views.queryAll),
]

展示文章详细内容:

#阅读全文功能
def detail(request ,postid):postid = int(postid)#根据postid查询帖子的详情信息post = Post.objects.get(id=postid)return render(request, 'detail.html' ,{'post' :post})
{% extends' base.html' %}{% load myfilter %}{% block title %}详情页面
{% endblock %}
{% block left %}
{% endblock %}

使用markdown格式展示(解析)- 加过滤器
新建templatetags包
新建myfilter.py文件

#coding=utf-8
from django.template import Libraryregister = Library()@register.filter
def md(value):import markdownreturn markdown.markdown(value)

分享功能:
【参考】http://share.baidu.com/code

集成富文本编辑器:

pip install django-ckeditor

然后在setting.py文件中添加:

INSTALLED_APPS =['django.contrib.admin',' django. contrib.auth',' django . contrib. contenttypes ','django. contrib. sessions'' django. contrib. messages' ,'django. contrib. staticfiles ' ,'post', 'ckeditor','ckeditor_uploader'
]# 配置media存放路径
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
CKEDITOR_UPLOAD_PATH ='upload/'
from blog.settings import DEBUG, MEDIA_ROOTurlpatterns=[url(r'^$',views.aueryAll),url(r'^page/(d+)$',views.queryAll),url(r'ckeditor/', include('ckeditor.uploader.urls'))
]from django.views.static import serve
if DEBUG:urlpatterns+=url(r'^media/(?P.*)/$', serve, {"document_root": MEDIA_ROOT}),

修改模型类model.py

from django.db import models
from ckeditor_uploader.fields import RichTextuploadingField# Create your models here.
class category(models.Model):cname = models.CharField(max_length=30, unique=True)class Meta: db_table = 't_category'def __unicode__(self):return u'Category:%s'%self.cnameclass Tag( models. Model):tname = models.CharField(max_length= 30, unique=True)class Meta: db_table = 't_tag'def __unicode__(self):return u'Tag:%s'%self.tnameclass Post(models.Model):title = models.CharField(max_length=100, unique=True)desc = models.CharField(max_length=100)# content = models.TextField()content = models.RichTextuploadingField(null=True,blank=True)created = models.DateTimeField(auto_now_add=True)category = models.ForeignKey(Category,on_delete=models.CASCADE)tag = models.ManyToManyField(Tag)class Meta: db_table = 't_post'def __unicode__(self):return u'Post:%s'%self.title

终端执行全局迁移文件:

python manage.py makemigrations
python manage.py migrate

2.帖子分类

放到全局上下文当中去:
新建mycontextprocessor,py文件:

#coding=utf-8
from django.db.models import Count
from post.models import Post
def getRightInfo(request):#1.获取分类信息r_catepost = Post.objects.values('category_cname', 'category').annotate(c=Count('*')).order_by('-c')return {'r_catepost':r_catepost}

setting.py文件中添加:

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','post.mycontextprocessor.getRightInfo'],},
},
]

近期文章查找:

#coding=utf-8
from django.db.models import Count
from post.models import Post
def getRightInfo(request):#1.获取分类信息r_catepost = Post.objects.values('category_cname', 'category').annotate(c=Count('*')).order_by('-c')#2.近期文章r_recpost = Post.objects.all().order_by('-created')[:3]return {'r_catepost':r_catepost,'r_recpost':r_recpost}

3.帖子归档

select created, count('*') from t_post GROUP BY DATE_FORMAT(created, '%Y-%m');
#coding=utf-8
from django.db.models import Count
from post.models import Post
def getRightInfo(request):#1.获取分类信息r_catepost = Post.objects.values('category_cname', 'category').annotate(c=Count('*')).order_by('-c')#2.近期文章r_recpost = Post.objects.all().order_by('-created')[:3]#3.获取日期归档信息from django. db import connectioncursor = connection.cursor()cursor.execute("select created, count('*' ) fromt_ post GROUP BY DATE_FORMAT(created, '%Y-%m')")r_filepost = cursor.fetchall()return {'r_catepost':r_catepost,'r_recpost':r_recpost,'r_filepost':r_filepost}

4.近期文章(见上)

#根据类别id查询所有帖子
def queryPostByCid(request,cid):postlist = Post.objects.filter(category_id=cid)# Post.objects.filter(category_id=cid)return render(request,'article.html',{'postList':postList})

setting.py中配置时区:
在这里插入图片描述

#根据发帖时间查询所有帖子
def queryPostByCreated(request,year,month):postlist = Post.objects.filter(created__year=yeac,created__month=month)return render(request,'article.html' ,{'postList':postlist})
urlpatterns=[url(r'^$',views.queryAll),url(r'^page/(\d+)$' ,views.queryAll),url(r'^post/(\d+)$' ,views.detail),url(r'^category/(\d+)$' ,views.queryPostByCid),url(r'^archive/(\d+)/(\d+)$' ,views.queryPostByCreated),
]

django缓存:

setting.py文件中配置缓存:

MIDDLEWARE = ['django.middleware.cache.UpdateCacheMiddleware' ,#必须放在第一个'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','django.middleware.cache.FetchFromCacheMiddlewar'#必须放在最后一个
]
CACHES = {'default': {'BACKEND':'django.core.cache.backends.locmem.LocMemCache',}
}
CACHE_MIDDL_EWARE_KEY_PREFIX = ''
CACHE_MIDDL_EWARE_SECONDS = 600
CACHE_MIDDLEWARE_ALIAS = 'default'
from django.core.cache import caches
#获取缓存对象
cacheobj = caches['default']
def cache_wrapper(func):def wrapper(request, *args,**kwargs):#从缓存对象中获取数据data= cacheobj.get(request.path)#判断获取的数据是否存在于缓存史if data:print '读取缓存中的数据'return HttpResponse(data)#执行views,函数去数据库中获取数据print '从数据库中获取数据'response = func(request,* args,** kwargs )print '进行缓存数据'#将数据库史查询到的数据插入缓存cacheobj.set(request.path,response.content)return response return _wrapper@cache_wrapper
def index_view(request):clist = Clazz.objects.all()return render(request,'index.html',{'clist':clist})

在这里插入图片描述

Redis:

CACHES = {'default': {'BACKEND':'django.core.cache.backends.locmem.LocMemCache',},'redis':{"BACKEND":"django_redis.cache.RedisCache""LOCATION": "redis://127.0.0.1:6379/1"}
}
CACHE_MIDDL_EWARE_KEY_PREFIX = ''
CACHE_MIDDL_EWARE_SECONDS = 600
CACHE_MIDDLEWARE_ALIAS = 'default'

5.关于博主

6.全文搜索

django提供的全文检索类库
●django-haystack(容器)
●whoosh(具体的搜索引擎)
●django-haystack支持Solr,Elasticsearch,Whoosh, Xapian四种搜索引擎

实现步骤
1.安装模块
i.先安装pip install django-haystack
i.后安装pip install whoosh
2. settings中添加应用

INSTALLED_ APPS = [' django . contrib. admin',' django. contrib. auth','django . contrib. contenttypes' ,'django. contrib. sessions','django . contrib. messages',' django. contrib. staticfiles','post','ckeditor','ckeditor uploader','haystack'
]	

3.settings中添加配置生成索弓|文件路径

#指定生成的索引路径
HAYSTACK_CONNECTIONS = {'default': {'ENGINE' : 'haystack.backends.whoosh_backend.WhooshEngine','PATH' : os.path.join(BASE_DIR,' whoosh_index'),},
}
#实时生成索引文件
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalprocessor'

4.在post应用包下创建search. jindexes.py文件
5.编辑post/search. indexes.py文件(和实体对应)

#coding=UTF-8
from haystack import indexes
from post.models import *#注意格式(模型类名+ Index)
class PostIndex(indexes.SearchIndex , indexes.Indexable):text = indexes.CharField(document=True, use_template=True)#给title, content设置素引title = indexes.NgramField(model_attr= 'title')content = indexes.NgramField(model_attr= 'content')def get_model(self):return Postdef index_queryset(self, using=None):return self.get_model().objects.order_by('-created')

6.创建搜索引擎模板( project/templates/search/indexes/yourapp/post_text.txt )在项目根目录/templates/目录下创建
search/indexes/post/post_text.txt文件(模型类名小写_text.txt)
7.编辑post _text.txt文件

{{object.title}}
{{object. content}}

8.通过命令生成索引文件

python manage.py rebuild_index 
python manage.py update_index (如果查询不到内容)

编辑搜索框请求信息
项目根目录/templates/header.html
在这里插入图片描述
配置URL
1.项目包/urls.py文件
在这里插入图片描述
在项目根目录下的templates/search下创建search.html
在这里插入图片描述

中文分词:

参考API : https://github.com/fxsjy/jieba
1.安装库

pip install jieba

2.在post应用包下创建tokenizer.py文件
3.编辑tokenizer.py文件

#coding=utf-8
import jieba
from whoosh.analysis import Tokenizer, Tokenclass ChineseTokenizer(Tokenizer):def __call__(self, value, positions=False, chars=False,keeporiginal=False, removestops=True,start_pos=0, start_char=0, mode='', **kwargs):t =Token(positions, chars, removestops=removestops, mode=mode,**kwargs)seglist = jieba.cut(value, cut_all=False) # (精确模式)使用结巴分词库进行分词# seglist = jieba.cut for- search(value) #(搜索引擎模式)使用结巴分词库进行分词for W in seglist:print wt.original = t.text = Wt.boost = 1.0if positions:t.pos = start_pos + value.find(w)if chars:t.startchar = start_char + value.find(w)t.endchar = start_char + value.find(w) + len(w)yield t # 通过生成器返回每个分词的结果tokendef ChineseAnalyzer() :return ChineseTokenizer()

4.拷贝C:\Python27\Lib\site-packages\haystack\backends目录whoosh_backend.py到post目录下,改名为whoosh_cn_backend.py
5.编辑post/whoosh_cn_backend.py文件
搜索build_schema函数
最后一个else中:
在这里插入图片描述
修改为:ChineseAnalyzer

6.修改blog/settings.py文件
在这里插入图片描述
重新生成索引文件:

python manage.py rebuild_index 
python manage.py update_index (如果查询不到内容)

7.发布帖子(admin中)

8.部署

https://www.pythonanywhere.com

虚拟环境
virtualenv blogenv --python=python2.7创建虚拟环境
source activate激活虚拟环境
deactivate退出虚拟环境
workon blogenv加入虚拟环境

安装各种库文件

实现步骤

1.setting.py中配置修改:
在这里插入图片描述
2.拷贝项目到桌面并且添加zip压缩包
3.将blog.zip文件上传至pythonanywhere.com[files]目录中
4.打开bash窗口解压blog.zip文件
5.创建虚拟环境blogenv
6.激活虚拟环境
7.在虚拟环境安装各种模块
8.配置各个静态资源文件位置:在pythonanywhere.com[web]目录中配置路径
在这里插入图片描述
9. reload服务器

附加:Git

windows,版本下载地址:https://git-scm.com/download/win
其他可参考:https://blog.csdn.net/hhhmonkey/article/details/108108259

常用命令:

# 初始化仓库
$ git init# 1.工作区中创建新文件hello.py
$ vi hello.py
#2.查看文件状态
$ git status
# 3.将源码拷贝到暂存区
$ git add hello.py
# 4.将暂存区移动到当前分支
$ git commit -m “创建新文件hello.py"
#5.查看状态
$ git status On branch masternothing to commit, working tree clean#查着工作区和版本库里面最新版本的区别
$ git diff HEAD -- hello.py
方式1 :可以撒销未被追踪的文件#丢弃工作区的修改$ git checkout -- hello.py
方式2 :可以撒销到任意版本#查看操作日志$ git logcommit c4e993ddb36d77710dad2c7c8c18130f9a761946 (HEAD -> master)$ git log --onelinec4e993d (HEAD -》master) first add#回退到某个版本1$ git reset c4e993ddb36d77710dad2c7c8c18130f9a761946#回退到某个版本2$ git reset --hard c4e993ddb36d77710dad2c7c8c18130f9a761946#回退到上一个版本$ git reset HEAD# 1.删除工作区中的文件
rm hello.py
# 2.删除暂存区中的文件
git rm hello.py
# 3.删除当前分支中的文件
git commit m '描述信息'#修改文件
$ vi hello.py
#查看状态
$ git status
#添加营存区
$ git add hello.py
#添加版本库
$ git commit -m '描述信息' 

分支操作

分支可以理解成独立开发功能的小房间。

#创建分支
$ git branch 分支名
#查看分支
$ git branch
#切娛分支
$ git checkout 分支名
#创遇+切换分支
$ git checkout -b 分支名
#台并某分支到当前分支
$ git merge 分支名
#删除某分支
$ git branch -d 分支名当前分支1 分支2 前提分支1和分支2都进行了代码修改。
解决方法:将分支2的内容合并到分支1# 1.切换到当前分支1$ git checkout 分支1
# 2.和分支2进行台并$ git merge 分支2
# 3.执行第二步后出现冲突(CONFLICT )$ git merge devAuto-merging hello. pyCONFLICT (content): Merge conflict in hello.pyAutomatic merge failed; fix conflicts and then commit the result.
#4.解决方案:print 'first "<<<<<<< HEADprint 'master second'======= print 'dev second>>>>>>> dey
1.编辑合并分支1和分支2的内容
2.修改好之后,$ git add 文件名
3. $ git commit -m "描述信息"

远程库和本地库

远程库
1.github版本库即为远程库。

本地库
1.本地创健的Git版本库即为本地库。

1.先在github官网中注册账户。
2.创建SSH key。由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的。Windows下打开Git Bash, 创建SSH key。$ ssh-keygen -t rsa -C "youremai@example.com"
3.在用户主目录里找到.ssh目录,里面有id_ rsa和id. rsa.pub两个文件(密钥对)。用户主目录: C:\Users\Administrator
4.登陆GitHub,打开"Account settings", "SSH Keys"页面。
5.点"Add SSH Key", 填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。

本地库关联远程库

1. github注 册账户
2.创建远程版本库
3.本地库和远程库进行关联$ git remote -v
#在本地库当前分支
$ git remote add origin git@github.com:pythonde/newRepository.git4.更新本地库
git pu1h --rebase origin master
git status
git add hello.py
git comit -m '描述信息'5.将本地库内容上传至远程库
git push -u origin master

【参考】https://www.bilibili.com/video/BV1z44y187vi
另外,参考视频中存在项目2-商城项目可以参考

相关内容