只是自己的學(xué)習(xí)復(fù)習(xí)筆記电湘。隔节。。很多內(nèi)容是基于其他資料的寂呛,寫下備忘怎诫。
終于畢業(yè)了,最近在unpaid實(shí)習(xí)贷痪,作為全職入職前的一個過渡幻妓。剛好要用到之前網(wǎng)頁應(yīng)用開發(fā)課上學(xué)的知識,發(fā)現(xiàn)好多都記不清了劫拢,在這里復(fù)習(xí)一下吧肉津。
目標(biāo):在AWS上的Ubuntu機(jī)器上,創(chuàng)建Django項目舱沧,并用Apache做成web server妹沙。
1. 安裝Django
更新apt-get:
$ sudo apt-get update
順便記錄一下自己總是記不清的 apt-get update 與 upgrade 的區(qū)別:update命令會更新所有可供下載的package條目以及它們的版本,而upgrade會根據(jù)現(xiàn)有的條目及版本升級更新所有你已經(jīng)安裝的package熟吏。因此距糖,當(dāng)你想要更新自己所安裝的所有package時,一般先運(yùn)行update命令分俯,再運(yùn)行upgrade命令肾筐。但感覺upgrade還是根據(jù)需要具體更新某個package比較好,所以update才是我們最經(jīng)常需要用到的命令缸剪。
安裝python及pip:
$ sudo apt-get install python
$ sudo apt-get install python-pip
查看python版本:
$ python --version
Python 2.7.12
正確顯示版本號吗铐,說明Python安裝成功。也可以選擇安裝Python3杏节,同樣有Django. 本文用Python2舉例了唬渗。
用pip安裝Django:
$ sudo pip install django
安裝完成后典阵,可以查看Django版本
$ django-admin version
1.11.6
正確顯示版本號,說明安裝成功镊逝。
2. 創(chuàng)建Django project以及其下的網(wǎng)頁App
這一步是可選的壮啊。如果已經(jīng)在本地環(huán)境創(chuàng)建好Django project, 也可以直接把源碼上傳烙如,或者用Git來做version control來同步本地與云端服務(wù)器代碼灭衷。
首先創(chuàng)建Django project:
$ django-admin startproject mysite
在mysite中創(chuàng)建一個新app:
~$ cd mysite/
~/mysite$ python manage.py startapp myapp
在 mysite/settings.py中加入該app:
INSTALLED_APPS = [
? 'django.contrib.auth',
? 'django.contrib.contenttypes',
? 'django.contrib.sessions',
? 'django.contrib.sites','django.contrib.messages',
? 'django.contrib.staticfiles',
? 'myapp',
]
更改myapp/urls.py從而添加app的url:
fromdjango.conf.urls import url
from . import views
urlpatterns=[
? ? url(r'^$', views.index, name='index'),
]
這里加入的一條url使得root url (r'^$') 會運(yùn)行views中名為的index函數(shù)。r表示regular expression晋涣,后面的單引號中的內(nèi)容表示正則表達(dá)式match的內(nèi)容座菠,^和$分別表示行開頭和行結(jié)尾狸眼,具體如果不清楚請進(jìn)一步學(xué)習(xí)正則表達(dá)式regex。后面的name是在html template中鏈接此url的名稱浴滴,目的是為了更加簡單的match到這個url, 也可選擇不定義name而使用整個url字符串來鏈接此url拓萌。
同時,還需要更改mysite/urls.py使得網(wǎng)站的某些url能match到myapp中:
from django.conf.urls import include,url
from django.contrib import admin
urlpatterns=[
? ? url(r'^myapp/',include('myapp.urls')),
? ? url(r'^admin/',admin.site.urls),
]
此時以mysite/myapp/ 為開頭的url會被match到myapp/urls.py中升略,并根據(jù)其中的url進(jìn)一步進(jìn)行匹配微王。
由于我們將mysite/myapp/這個url匹配到了index這個函數(shù)中,此時需要在views.py中定義該index函數(shù)來實(shí)現(xiàn)功能:
from django.http import HttpResponse
def index(request):
? ? return HttpResponse('Hello World')
該函數(shù)會生成并返回一條內(nèi)容為“Hello World”的Http response品嚣。
最后炕倘,運(yùn)行該server:
~/mysite$ python manage.py runserver
這時Django會默認(rèn)在:8000端口運(yùn)行該網(wǎng)站。現(xiàn)在翰撑,當(dāng)該網(wǎng)站host/myapp:8000 的url收到訪問時激才,會收到該條Http回復(fù)。還可以添加參數(shù)來確定自己想在什么端口運(yùn)行該程序额嘿,以及允許哪些IP訪問:
~/mysite$ python manage.py runserver 0.0.0.0:80
這樣會在80端口(HTTP)運(yùn)行該網(wǎng)站瘸恼,并接受任何IP地址的訪問。
3. 安裝并運(yùn)行Apache, 并鏈接Apache與Django
利用Apache與mod_wsgi來搭建服務(wù)器是Django官方推薦的一種部署方式册养。
首先安裝Apache:
$ sudo apt-get install apache2
Apache是目前最為廣泛應(yīng)用的開源HTTP網(wǎng)站服務(wù)器軟件东帅,世界上有超過60%的服務(wù)器是以Apache為基礎(chǔ)搭建的。
接著安裝mod_wsgi:
$ sudo apt-get install libapache2-mod-wsgi
mod_wsgi是Python的一個module球拦,它是提供基于Python的網(wǎng)站在Apache運(yùn)行的接口靠闭。注意這里是Python2的安裝包,Python3對應(yīng)的包是libapache2-mod-wsgi-py3坎炼。
接下來我們需要寫一個wsgi.py腳本來作為鏈接Apache與Django的橋梁愧膀。為了方便版本管理,我們在mysite/mysite/目錄下新建一個名為apache/的文件夾谣光。原來的目錄結(jié)構(gòu)是這樣的:
mysite/
? ?manage.py? ?
? ? mysite/
? ? ? ? __init__.py
? ? ? ? settings.py?
? ? ? ? urls.py
? ? myapp/
? ? ? ? models.py
? ? ? ? views.py
新建后是這樣的:
mysite/
? ? manage.py
? ? mysite/
? ? ? ? __init__.py
? ? ? ? settings.py
? ? ? ? urls.py
? ? ? ? apache/
? ? ? ? ? ? __init__.py
? ? ? ? ? ? override.py
? ? ? ? ? ? wsgi.py
? ? myapp/
? ? ? ? models.py
? ? ? ? views.py
為什么說這樣方便版本管理呢檩淋?只用在Git中ignore掉apache這個文件夾,它便會被Git忽略萄金,因?yàn)榇宋募A只需在Apache服務(wù)器上存在蟀悦,并不是該Django項目的一部分媚朦。
接著,分別添加幾個Python文件的內(nèi)容日戈。__init__.py中不需要任何內(nèi)容询张,有它只是為了讓python把當(dāng)前目錄識別為一個package。
override.py中需要覆蓋部分Django project中settings.py中的設(shè)定浙炼,在ALLOWED_HOST中加入該server的域名份氧。此處DEBUG選項設(shè)置為了True,在完成開發(fā)后應(yīng)當(dāng)改為False:
# override.py
from mysite.settings import *
DEBUG=True
ALLOWED_HOSTS=[
? ? 'mydomain.com',
]
添加wsgi.py中的設(shè)定:
import os, sys
# Calculate the path based on the location of the WSGI script.
apache_configuration = os.path.dirname(__file__)
project = os.path.dirname(apache_configuration)
workspace = os.path.dirname(project)
sys.path.append(workspace)
sys.path.append(project)
# Add the path to 3rd party django application and to django itself.
sys.path.append('/home/myuser')
os.environ['DJANGO_SETTINGS_MODULE']? = 'webapps.apache.override'
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
注意把myuser改成自己的系統(tǒng)用戶名就行弯屈。
設(shè)定好各個.py文件的內(nèi)容后半火,把a(bǔ)pache/文件夾的歸屬權(quán)轉(zhuǎn)讓給Apache的默認(rèn)用戶www-data,使得Apache可以訪問此文件夾:
$ sudo chown www-data:www-data apache/
修改Apache的設(shè)定:
$ sudo vim /etc/apache2/sites-enabled/000-default.conf
在文件中<VirtualHost*:80> 標(biāo)簽中加入以下內(nèi)容:
WSGIScriptAlias /mypath/ /home/myuser/mysite/apache/wsgi.py
<Directory "/home/myuser/mysite/mysite/apache/">
? ? Require all granted
</Directory>
WSGIScriptAlias會讓你的網(wǎng)站在根url下的/mypath/路徑運(yùn)行季俩。也就是說,現(xiàn)在當(dāng)你訪問 http://mydomain.com/mypath/ 時就會訪問到你的Django根url梅掠。如果想讓網(wǎng)站的根url直接對應(yīng)Django App, 可以將‘/mypath/’直接替換為'/'酌住。
修改完后,需要重啟apache服務(wù):
$ sudo service apache2 restart
到此為止阎抒,就可以通過“http://mydomain.com/mypath/”正式訪問你的Django App啦酪我!
參考資源:
https://www.sitepoint.com/deploying-a-django-app-with-mod_wsgi-on-ubuntu-14-04/
https://askubuntu.com/questions/94102/what-is-the-difference-between-apt-get-update-and-upgrade
https://docs.djangoproject.com/en/1.11/howto/deployment/wsgi/modwsgi/
https://stackoverflow.com/questions/35674590/what-is-the-difference-between-wsgi-python-wsgi-wsgi-server-and-mod-wsgi