文章目录
项目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 %}
<sty1e>
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;
}
</style>
{% endblock %}
{% block left%}
<div id="main">
<article class="article article-type-post" >
<div class="article-meta">
<a class="article-date">
<time>2018-06-26 16:58:24</time>
</a>
<div class=" article-category">
<a class="article-category-link" href="#" target=" blank">后端</a>
</div>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="#" target=" blank">T4</a>
</h1>
</header>
<div class=" article-entry" itemprop="articleBody">
<h2>前言</h2>
<hr>
"..."
<p class="article-more-link">
<a href="/post/8" target=" blank">阅读全文</a>
</p>
</div>
<footer class= "article- footer">
<a data-url="存放文章的url" class="article-share-link">分享</a>
<u1 class="article-tag-list">
<li class="article-tag-list-item">
<a class="article-tag- list-link" href= "#">Python</a>
</li>
</ul>
</footer>
</div>
</article>
</div>
{% 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.cname
class 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.tname
class 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})
<div id="main">
{% for post in postList %}
<article class="article article-type-post" >
<div class="article-meta">
<a class="article-date">
<time>{{ post.createdldate:'Y-m-d H:i:s' }}</time>
</a>
<div class=" article-category">
<a class="article-category-link" href="#" target=" blank">{{post.category.cnamel} }
</a>
</div>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="#" target=" blank">{{post.title}}</a>
</h1>
</header>
<div class=" article-entry" itemprop="articleBody">
<h2>前言</h2>
<hr>
{{post.desc}}
<p class="article-more-link">
<a href="/post/{{post.id}}" target=" blank">阅读全文</a>
</p>
</div>
<footer class= "article- footer">
<a data-url="存放文章的url" class="article-share-link">分享</a>
<u1 class="article-tag-list">
{%for t in post.tag.all %}
<li class="article-tag-list-item">
<a class="article-tag- list-link" href= "#">{{t.tname}}</a>
</li>
<%endfor%>
</ul>
</footer>
</div>
</article>
<%endfor%>
<nav id=" page-nav" >
{% if postList.has_previous%}
<a class= "extend next" rel="next" href="/page/{{postList.previous_page_number
}}">Prev >></a>
{% endif %}
<span class="page-number current" >1</ span>
{% for page in pagelist %}
{% if currentNum == page %}
<span class=" page-number current">{{ page }}</span>
{% else %}
<a class="page-number" href= '/page/{{page}}'>{{page}}</a>
` {% endif %}
{%endfor %}
{% if postList.has_next%}
<a class= "extend next" rel="next" href="/page/{{postList.next_page_number
}}">Next >></a>
{% endif %}
</nav>
</div>
# 分页
#演染主页面
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+9
if end > pageObj.num_pages:
end = pageObj.num_pages
if end <= 10:
begin = 1
else:
begin=end-9
pagelist = 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 %}
<div id="main">
<article class="article article-type-post">
<div class="article-meta">
<a class="article-date">
<time>{{post.created|date: 'Y-m-d H:i:S'}}</time>
</a>
<div class="article-categqry">
<a class=" article-category-link" href="#" target=" blank" >{{post.category.cname}}</a>
</div>
</div>
<div class="article-inner>
<header class= "article-header">
<h1 itemprop="name >
<a class="article-title">T4</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h2>前言</h2>
{{post.desc }}
<br>
{{post.content|md|safe}}
</div>
</div>
</article>
</div>
{% endblock %}
使用markdown格式展示(解析)- 加过滤器
新建templatetags包
新建myfilter.py文件
#coding=utf-8
from django.template import Library
register = Library()
@register.filter
def md(value):
import markdown
return 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_ROOT
urlpatterns=[
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<path>.*)/$', 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.cname
class 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.tname
class 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 connection
cursor = 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 Post
def 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, Token
class 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 w
t.original = t.text = W
t.boost = 1.0
if 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 # 通过生成器返回每个分词的结果token
def 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 master
nothing to commit, working tree clean
#查着工作区和版本库里面最新版本的区别
$ git diff HEAD -- hello.py
方式1 :可以撒销未被追踪的文件
#丢弃工作区的修改
$ git checkout -- hello.py
方式2 :可以撒销到任意版本
#查看操作日志
$ git log
commit c4e993ddb36d77710dad2c7c8c18130f9a761946 (HEAD -> master)
$ git log --oneline
c4e993d (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 dev
Auto-merging hello. py
CONFLICT (content): Merge conflict in hello.py
Automatic merge failed; fix conflicts and then commit the result.
#4.解决方案:
print 'first "
<<<<<<< HEAD
print '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.git
4.更新本地库
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-商城项目可以参考