安老師今年會參與某項目自動化運維平臺的搭建。在此期間,儘量分享一些有用的知識幫助你們學習。本次分享咱們來學習下Django的基本功,如何搭建一個入門版的博客(入門版,進階版,高級版,大神版)。後續將會爲你們介紹另外幾個版本的博客,敬請期待!html
一. 基本步驟python
1. 配置虛擬環境sql
Python版本:2.7.15
數據庫
Django版本:1.11.20django
主機IP地址:192.168.117.30
瀏覽器
數據庫:SQLitesession
2. 建立和配置[入門版]博客app
3. 優化[入門版]博客運維
01ide
配置虛擬環境
1. 安裝python(2.7.15)版本的虛擬環境
[python@PYMY-DDB ~]$ pyenv virtualenv 2.7.15 MyDjango
2. 啓用MyDjango虛擬環境
[python@PYMY-DDB ~]$ pyenv activate MyDjango
pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior.
(MyDjango) [python@PYMY-DDB ~]$ python -V
Python 2.7.15
3. 安裝Django
(MyDjango) [python@PYMY-DDB ~]$ pip install django
02
建立[入門版]博客項目
1. 建立easyblog項目
(MyDjango) [python@PYMY-DDB Myproject]$ pwd
/home/python/Myproject
(MyDjango) [python@PYMY-DDB Myproject]$ django-admin startproject easyblog
2. 建立APP(mysite)
(MyDjango) [python@PYMY-DDB Myproject]$ django-admin startproject easyblog
(MyDjango) [python@PYMY-DDB Myproject]$ ls -l
drwxrwxr-x 3 python python 4096 Feb 24 21:31 easyblog
(MyDjango) [python@PYMY-DDB Myproject]$ cd easyblog/
(MyDjango) [python@PYMY-DDB easyblog]$ python manage.py startapp mysite
(MyDjango) [python@PYMY-DDB easyblog]$ ls -l
total 12
drwxrwxr-x 2 python python 4096 Feb 24 21:31 easyblog
-rwxrwxr-x 1 python python 806 Feb 24 21:31 manage.py
drwxrwxr-x 3 python python 4096 Feb 24 21:31 mysite
3. 查看easyblog項目的結構
(MyDjango) [python@PYMY-DDB Myproject]$ pwd
/home/python/Myproject
(MyDjango) [python@PYMY-DDB Myproject]$ tree easyblog
easyblog
├── easyblog
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── settings.py
│ ├── settings.pyc
│ ├── urls.py
│ └── wsgi.py
├── manage.py
└── mysite
├── admin.py
├── apps.py
├── __init__.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
4. 配置settings.py
4.1 添加主機的IP地市
將
ALLOWED_HOSTS = []
改成以下:
ALLOWED_HOSTS = ['192.168.117.30']
4.2 添加APP(mysite)模塊
將
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
改成以下:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'mysite',
]
4.3 修改語言和時區
將
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
改成以下:
ANGUAGE_CODE = 'zh_hans'
TIME_ZONE = 'Aisa/Shanghai'
5. APP項目所需的數據庫的中介文件
執行如下命令,Django會默認使用SQLite存儲數據庫(簡化文件型SQL關係數據庫系統)。執行migrate命令,也會建立db.sqlite3文件。
(MyDjango) [python@PYMY-DDB easyblog]$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying sessions.0001_initial... OK
此網站添加的數據都會放在db.sqlite3文件!
[python@PYMY-DDB easyblog]$ ls -l
total 64
-rw-r--r-- 1 python python 41984 Feb 24 22:48 db.sqlite3
drwxrwxr-x 2 python python 4096 Feb 26 22:31 easyblog
-rwxrwxr-x 1 python python 806 Feb 24 21:31 manage.py
drwxrwxr-x 3 python python 4096 Feb 26 22:30 mysite
6. 測試網站的IP和端口是否OK
(MyDjango) [python@PYMY-DDB easyblog]$python manage.py runserver 192.168.117.30:8000
注意:默認鏈接:python manage.py runserver -> http://127.0.0.1:8000
打開網頁,檢測IP和端口是否成功!
7. 定義數據類型(models.py)
默認狀況下,Django的數據庫是以Model方式操做,在程序中不直接面對數據庫,而是以class類先建立好Model,而後經過操做Model達到操做數據庫的目的。好處是往後如需更換數據庫,無須修改大量程序代碼。
(MyDjango) [python@PYMY-DDB mysite]$ pwd
/home/python/Myproject/easyblog/mysite
(MyDjango) [python@PYMY-DDB mysite]$ cat models.py
from django.db import models
from django.utils import timezone
#Create your models here.
class Post(models.Model):
title = models.CharField(max_length=200)
slug = models.CharField(max_length=200)
body = models.TextField()
pub_date = models.DateTimeField(default=timezone.now)
class Meta:
ordering = ('-pub_date',)
def __unicode__(self):
return self.title
# title 顯示 文章的標題
# slug 顯示文章的網址
# body顯示文章的內容
# pub_date是本文的發表時間
# __unicode__ 以文章標題做爲顯示的內容,增長操做過程當中的可讀性,使用 __unicode__ 而不是str,讓這個標題能夠正確地支持中文標題。
# pub_date,以timezone.now的方式讓其自動產生,須要pytz的模塊(pip install pytz)
8. 建立數據庫和同步Django間的中介文件
執行"python manage.py makemigrations mysite",讓此模型生效,執行「python manage.py migrate」,同步更新數據庫內容。
(MyDjango) [python@PYMY-DDB easyblog]$ python manage.py makemigrations mysite
Migrations for 'mysite':
mysite/migrations/0001_initial.py
- Create model Post
(MyDjango) [python@PYMY-DDB easyblog]$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, mysite, sessions
Running migrations:
Applying mysite.0001_initial... OK
9. 啓動 admin 的管理界面
(MyDjango)[python@PYMY-DDB easyblog]$ python manage.py createsuperuser
Username (leave blank to use 'python'): admin
Email address:
Password: -- 密碼:"admin" 密碼要八位數
Password (again):
This password is too short. It must contain at least 8 characters.
This password is too common.
Password: -- 密碼:"python1234" ,PASS!
Password (again):
Superuser created successfully.
10. 將Post歸入管理,修改admin.py
1)導入Post類,而後經過admin.site.register註冊。完成設置,經過打開http://192.168.117.30:8000,能夠看到登錄頁面。
2)PostAdmin類讓頁面顯示標題,連接和日期
(MyDjango) [python@PYMY-DDB mysite]$ pwd
/home/python/Myproject/easyblog/mysite
(MyDjango) [python@PYMY-DDB mysite]$ cat admin.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib import admin
from .models import Post
# Register your models here.
class PostAdmin(admin.ModelAdmin):
list_display = ('title','slug','pub_date')
admin.site.register(Post,PostAdmin)
1)打開網頁http://192.168.117.30:8000/admin/,登錄!
2)Posts頁面,這是一個數據庫管理頁面,第一次進入Posts管理頁面是沒有任何內容的!
3)向Posts增長數據
4)增長《王者榮耀-貂蟬》的數據,如此類推增長呂布和鎧,slug要用英文或者數字。
5)查看Posts的頁面(共新增3組數據)
11. urls.py 負責網站和程序間的對應工做
"^"表示字符串開頭, "$"表示字符串結尾。"^$"指的是根網址,就會調用homepage函數。
(MyDjango) [python@PYMY-DDB easyblog]$ cat urls.py
from django.conf.urls import include,url
from django.contrib import admin
from mysite.views import homepage
urlpatterns = [
url(r'^$', homepage),
url(r'^admin/', include(admin.site.urls)),
]13. 建立網頁輸出模板 templates
12. 修改settings.py中的TEMPLATES
如何把拿到的數據進行排版下,變得更加美觀,那就是經過template模板。以.html的文件形式存儲在templates目錄。
12.1 新建templates目錄
(MyDjango) [python@PYMY-DDB easyblog]$ pwd
/home/python/Myproject/easyblog
(MyDjango) [python@PYMY-DDB easyblog]$ mkdir templates/
12.2 修改DIRS內容,新增templates目錄
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',
],
},
},
]
13. 修改views.py
views.py是負責如何把這些數據取出來,如何存進去等程序邏輯。
1)用Post.objects.all()取得全部數據項。
2)當網站有數據須要輸出的時候,則經過渲染函數(render,或者網頁顯示)把數據存放到指定的位置中,獲得的結果再交給HttpResponse輸出給瀏覽器。
3)使用locals()函數把當前內存中的局部變量使用字典打包起來,能夠在.html模板中接收到全部的局部變量。
(MyDjango) [python@PYMY-DDB mysite]$ cat views.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.template.loader import get_template
from django.shortcuts import render
from django.http import HttpResponse
from .models import Post
from datetime import datetime
# Create your views here.
def homepage(request):
template = get_template('index.html')
posts = Post.objects.all()
now = datetime.now()
html = template.render(locals())
return HttpResponse(html)
14. 建立index.html模板
把第13步驟,接收到的局部變量posts和now都放在index.html中使用。
(MyDjango) [python@PYMY-DDB templates]$ cat index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>
歡迎光臨個人博客
</title>
</head>
<body>
<h1>
歡迎光臨個人博客
</h1>
<hr>
{{posts}}
<hr>
<h3> 如今時刻: {{ now }} </h3>
</body>
</html>
15. 查看頁面展現效果
03
微優化[入門版]博客
1. 修改index.html模板
1)顯示標題。
2)每一個標題製做一個連接(slug),放在post/下。
3)單擊連接時,纔會打開另一個頁面,顯示該文章的內容。
4){% for %}和{% endfor %}成對使用,將post.slug和post.title循環取出。
(MyDjango) [python@PYMY-DDB templates]$ cat index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>
歡迎光臨個人王者博客
</title>
</head>
<body>
<h1 align="center">
歡迎光臨個人王者博客
</h1>
<hr>
{% for post in posts %}
<p style='font-family:微軟雅黑;font-size:14pt;font-weight:blod;'>
<a href='/post/{{ post.slug }}' > {{ post.title }} </a>
</p>
{% endfor %}
<hr>
<h3> 如今時刻: {{ now }} </h3>
</body>
</html>
2. 修改urls.py
1)'^post/(\w+)$',把全部post/開頭的網址後面的字符串都找出來看成第2個參數(第一個參數是request)傳送給showpost函數。要記得在urls.py導入showpost函數。
(MyDjango) [python@PYMY-DDB easyblog]$ cat urls.py
from django.conf.urls import url, include
from django.contrib import admin
from mysite.views import homepage,showpost
urlpatterns = [
url(r'^$', homepage),
url(r'^post/(\w+)$', showpost),
url(r'^admin/', include(admin.site.urls)),
]
3. 修改views.py
1)views.py新建showpost函數處理接收到的參數。
2)post = Post.objects.get(slug=slug)搜索文章。
3)redirect('/')的方式是直接返回首頁。
(MyDjango) [python@PYMY-DDB easyblog]$ cat views.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.template.loader import get_template
from django.shortcuts import render
from django.shortcuts import redirect
from django.http import HttpResponse
from .models import Post
from datetime import datetime
# Create your views here.
def homepage(request):
template = get_template('index.html')
posts = Post.objects.all()
now = datetime.now()
html = template.render(locals())
return HttpResponse(html)
def showpost(request, slug):
template = get_template('post.html')
try:
post = Post.objects.get(slug=slug)
if post != None:
html = template.render(locals())
return HttpResponse(html)
except:
return redirect('/')
4. 修改post.html模板
設計post.html和index.html有不少重複的元素。
(MyDjango) [python@PYMY-DDB easyblog]$ cat post.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>
歡迎光臨個人王者博客
</title>
</head>
<body>
<h1 align="center">{{ post.title }}
</h1>
<hr>
<p style='font-family:微軟雅黑;font-size:12pt;letter-spacing:2pt;'>
{{ post.body }}
</p>
<hr>
<h3 align="center"><a href = '/'>返回首頁</a></h3>
</body>
</html>
5. 查看頁面展現效果
1)首頁
2)點擊頁面
總結
搭建一個入門版的博客是否是很簡單呢?只須要修改下數據庫的內容加上一些模板就能夠搭建專屬你的博客啦!細心的讀者,有沒有發現,優化博客通常是修改這幾類文件(views.py,urls.py和html模板)呢?