Python+Django实现一个简单的博客网站
做一个博客,项目名为TodoBlog, 应用名为blog
本文是用python+Django实现一个简单的博客网站,博客的功能包括:
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。- 显示文章列表
- 显示文章内容
- 添加文章
- 修改文章
1、环境准备:
本项目用到的是一下几个工具及版本:Python3.7 、Django2.0.7、SQLite Expert Personal数据库查看工具、python项目编辑器--Pycharm
查看python版本的命令是:python
查看Django版本的命令是:python -m Django --version
2、创建项目
打开命令行,切换到自定的项目目录下,输入命令 django-admin startproject 项目名 ,回车;如 django-admin startproject TodoBlog
打开执行命令的路径下,可以看到多了一个TodoBlog的文件夹,文件夹下面有一个manage.py文件和TodoBlog文件夹:
项目目录结构:
manage.py 相当于Django的一个大管家,很多功能都需要manage.py来协助实现,输入python manage.py可看到manage.py的功能; TodoBlog(是项目的一个容器) __init__.py (Python中声明模块的文件(任何文件下有__init__.py文件的,都被认作是一个模块),内容默认为空) settings.py (重要的配置文件) urls.py (URL配置文件) wsgi.py(WSGI:Python Web Server Gateway Interface Python服务器网关接口,是Python应用于Web服务器之间的接口)
3、创建应用
项目相当于一个大环境,或者说是一个容器,实际使用时,需要创建应用。
创建应用:在manage.py文件同级路径下,输入命令:python manage.py startapp blog
查看应用情况:打开目录,在manage.py文件同级路径下,可看到多了一个名为blog的文件夹
应用目录结构:-
- migrations (数据移植(迁移)模块,自动生成)
- __init__.py
- migrations (数据移植(迁移)模块,自动生成)
-
- __init__.py
- admin.py (该应用的后台管理系统配置)
- apps.py (该应用的一些配置,Django-1.9后自动生成)
- models.py (数据模块,使用ORM框架,类似于MVC中的Models模块,在该文件中创建类即创建了一个表,添加类的属性即为该表创建了相应的表字段,当然,代码编写完成后 ,需要做数据迁移才能实现真正创建表和表字段)
- tests.py (自动化测试模块,在这里编写测试脚本)
- views.py (执行响应的代码所在模块,代码逻辑处理的主要地点,项目中大部分的代码均在这里编写)
4、将新创建的应用添加到settings.py的应用配置中
所有的应用都需要添加到项目的settings.py的INSTALLED_APPS的变量中,如下,添加blog应用,其他都是创建项目时Django自带的:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blog', ]
5、使用到的模块介绍
- views.py 这个模块属于后端的功能实现,与前端的交互,接收前端的请求等;(重点重点)
- templates
- 模板模块,其实在web项目中,很多web页面的排版,格式都是一样的,只是里面的数据内容不一样,为同一类的web页面创建一个模板,即创建一个HTML文件,将改动的数据用获取变量值的方式来实现;
- 使用方法是:在应用中添加templates文件夹,在文件夹下创建HTML文件
- admin admin是Django自带的后台管理系统,方便对数据库数据进行操作,例如增删查改等,admin中的字段与models模块创建的字段有关联
- models
- 创建数据库表字段,在该文件中新建一个继承models.Model的class,这个类即为一个表,在class中的属性即为这个表中的字段;
- 当然,并不是直接创建文件,创建一个类和类属性就能实现创建表的,中间有一个步骤,叫数据迁移,即将models--class下创建的表及表字段,利用Django封装好的SQL功能创建表,具体步骤是:
-
- python manage.py makemigrations
- python manage.py migrate
-
- 创建的表的情况,会以SQLite的文件格式存放在与manage.py同级的目录下,可通过SQLite Expert Personal工具打开;
- 注意:::每一次在models添加类或类属性是,都需要做数据迁移才能真正的创建表或添加表字段
6、为博客创建必要的字段
models.py文件代码
from django.db import models # Create your models here. class Article(models.Model): title = models.CharField(max_length=32, default='Title')#文章名 content = models.TextField(null=True) #内容允许为空 pub_time = models.DateTimeField(null=True) #更新时间 def __str__(self): return self.title
7、在admin文件中添加models.py创建的字段
from django.contrib import admin from .models import Article # Register your models here. class ArticleAdmin(admin.ModelAdmin): list_display = ('title', 'content', 'pub_time') list_filter = ('pub_time',) #过滤器 admin.site.register(Article, ArticleAdmin)
8、数据迁移
注意,上文说到,在models修改了表结构后,需要做数据迁移才能实现真正意义上的修改。
在命令行执行命令:
-
- python manage.py makemigrations
- python manage.py migrate
查看表创建情况:
- 方法一:在TodoBlog项目目录下,多了一个名为db.sqlite3的文件,可用SQLite Expert Personal工具打开,打开后,在应用下可看到表已创建;
- 方法二:打开admin控制台,查看方法,但是只有表中有数据才能用这种方法
- 使用manage.py创建admin的用户名和密码,命令为:python manage.py createsuperuser
- 启动项目服务器:python manage.py runserver
- 打开blog网页登录 http://127.0.0.1:8000/admin/
9、创建HTML文件
实现简单博客网站,使用HTML作前端展示和发送请求,后端使用Django自带的views.py接收请求并处理。
博客实现的功能有:显示文章列表、显示文章内容、添加文章、修改文章。
blog页面有三个:
-
- 主页:index
显示所有的文章列表,通过点击这些列表进入到文章内容中,并有一个编写新文章的入口
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <h1> 9 <a href="{% url 'blog:edit_page' 0 %}">新文章</a> 10 </h1> 11 {% for article in articles %} 12 <a href="{% url 'blog:article_page' article.id %}">{{ article.title }}</a> 13 <br/> 14 {% endfor %} 15 </body> 16 </html>
-
- 新文章、编辑文章:edit_page
如果是新文章,就显示title和content都为空,如果只是编辑文章的话,title和content的输入框显示之前编写的内容,输入框可以进行修改,修改文章后的提交按钮
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Edit Page</title> 6 </head> 7 <body> 8 {#<form action="{% url 'blog:edit_action' %}", method="post">#} 9 {# {% csrf_token %}#} 10 {# {% if article %}#} 11 {# <input type="hidden" name="article_id" value="{{ article.id }}">#} 12 {# <label>文章标题#} 13 {# <input type="text" name="title" value="{{ article.title }}">#} 14 {# </label>#} 15 {# <br/>#} 16 {# <label>文章内容#} 17 {# <input type="text" name="content" value="{{ article.content }}">#} 18 {# </label>#} 19 {# <br/>#} 20 {# {% else %}#} 21 {# <input type="hidden" name="article_id" value="0">#} 22 {# <label>文章标题#} 23 {# <input type="text" name="title" >#} 24 {# </label>#} 25 {# <br/>#} 26 {# <label>文章内容#} 27 {# <input type="text" name="content">#} 28 {# </label>#} 29 {# <br/>#} 30 {# {% endif %}#} 31 {# <input type="submit">#} 32 {#</form>#} 33 34 <form action="{% url 'blog:edit_action' %}" method="POST"> 35 {% csrf_token %} 36 <input type="hidden" name="article_id" value="{{ article.id | default:'0'}}"> 37 <label>文章标题 38 <input type="text" name="title" value="{{ article.title }}"/> 39 </label> 40 <br/> 41 <label>文章内容 42 <input type="text" name="content" value="{{ article.content }}"/> 43 </label> 44 <br/> 45 <input type="submit"> 46 47 48 </body> 49 </html>
-
- 文章展示:article_page
显示文章的内容,并有一个修改文章的入口
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Article Page</title> </head> <body> <h1>{{ article.title }}</h1> <br/> <h3>{{ article.content }}</h3> <br/> <a href="{% url 'blog:edit_page' article.id %}">修改文章</a> </body> </html>
10、后端代码在views.py模块中实现
views.py代码
1 from django.shortcuts import render 2 from django.http import HttpResponse 3 # Create your views here. 4 5 from . import models 6 def index(request): 7 #return HttpResponse('Hello, world!') 8 articles = models.Article.objects.all() 9 return render(request, 'blog/index.html', {'articles': articles}) 10 11 def article_page(request, article_id): 12 article = models.Article.objects.get(pk=article_id) 13 return render(request, 'blog/article_page.html', {'article':article}) 14 15 def edit_page(request, article_id): 16 if str(article_id) == '0': 17 return render(request, 'blog/edit_page.html') 18 article = models.Article.objects.get(pk=article_id) 19 return render(request,'blog/edit_page.html', {'article':article}) 20 21 def edit_action(request): 22 title = request.POST.get('title', 'TITLE') 23 content = request.POST.get('content', 'CONTENT') 24 article_id = request.POST.get('article_id', '0') 25 if article_id == '0': 26 models.Article.objects.create(title=title, content=content) 27 articles = models.Article.objects.all() 28 return render(request, 'blog/index.html', {'articles':articles}) 29 article = models.Article.objects.get(pk=article_id) 30 article.title = title 31 article.content = content 32 article.save() 33 return render(request, 'blog/article_page.html',{'article':article})
11、url配置
所有的HTML页面都要配置url才能在网页上访问,为了管理方便,可在应用中创建urls.py文件,该文件只对该应用有效 ,实现应用间的配置分离
方法:在应用blog的目录下,创建python文件,命名为urls,代码如下
#存放URL子路径目录 from django.conf.urls import url import blog.views as bv app_name='[blog]' urlpatterns = [ url(r'^index/$', bv.index), url(r'^article/(?P<article_id>[0-9]+)$',bv.article_page,name='article_page'), url(r'^edit/(?P<article_id>[0-9]+)$', bv.edit_page, name='edit_page'), url(r'^edit/action$', bv.edit_action, name='edit_action'), ]
当然,在项目根urls.py中做相应的配置才能识别到应用下的urls文件,代码如下:
1 """TodoBlog URL Configuration 2 3 The `urlpatterns` list routes URLs to views. For more information please see: 4 https://docs.djangoproject.com/en/2.0/topics/http/urls/ 5 Examples: 6 Function views 7 1. Add an import: from my_app import views 8 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 Class-based views 10 1. Add an import: from other_app.views import Home 11 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 Including another URLconf 13 1. Import the include() function: from django.urls import include, path 14 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 """ 16 from django.contrib import admin 17 from django.urls import path 18 from django.conf.urls import url, include 19 20 urlpatterns = [ 21 path('admin/', admin.site.urls), 22 url(r'blog/', include('blog.urls',namespace='blog')), 23 ]
12、访问网站
主页地址:http://127.0.0.1:8000/blog/index/
新文章地址:http://127.0.0.1:8000/blog/edit/0
查看第一篇文章地址:http://127.0.0.1:8000/blog/article/1
修改第一篇文章的地址:http://127.0.0.1:8000/blog/edit/1
