Windows7下的Django環境、項目及工程搭建(包括anaconda安裝方法)(一)

我這也是邊學邊寫,大家一起吧。參考的資料有點多,但都不太完全,只能依據理解自己把它集合在一起。
首先,安裝python就不說了,我用的是anaconda,我在找了很久走了很多彎路之後才找到,這是一個python的科學環境,它很強大,集成了各種python所需要的庫,使用的版本爲anaconda2,對應的python是python2.7。(它在安裝的時候環境變量會自己裝好)
另外,它是同時支持2.x和3.x的,想要再繼續裝python3.x和了解anaconda用法的,可以參考:http://python.jobbole.com/86236/
我用的是Win7,如果用Linux/Unix的話,就參考這個視頻:
http://www.imooc.com/video/8914,不會有我的問題那麼多
接下來就是Django的環境的搭建:
一、安裝Django
1、首先,anaconda裏面沒有帶Django,我們打開這個:
類似於cmd
2、然後,打開是這樣的打開是這樣的,長得和cmd差不多,我是把anaconda安裝在了D盤,然後第二個是你接下來的操作都在這個文件夾下。
3、那我現在要安裝包的話,先不用管它,直接安裝,用命令:conda+操作+安裝包名。conda命令很強大,它可以實現在cmd裏實現的任何命令,當然也可以當pip使用。這個conda和pip差不多,命令也類似,只不過將pip改成了conda而已,操作指的是install/uninstall/update這類。
4、我們安裝Django,在後面直接輸入:conda install Django,然後等待即可。因爲我已經安裝過了,這裏就不放圖了。
5、安裝完,你打開python/ipython,anaconda裏面有,然後輸入import Django,運行,如果沒出錯就是成功了。
6、有些人可能用的不是這個,直接用的python,如果需要,請在path里加上 “;D:/Python/Lib/site-packages/django/bin”,D盤是我安裝的路徑,配置它可以在需要管理Django項目的時候不用輸入很長很長的文件名。

二、創建Django項目
1、如果你不介意你的項目存在C盤,可以跳過這一步,否則我建議最好安裝在非系統盤,我放在了Anaconda/Scripts文件夾下,瞭解python的童鞋都知道,這是用來放可執行的文件的。
2、那麼,在prompt(就是那個和cmd差不多的)裏我們先輸入d:(這是我的盤),你們依據安裝的目錄隨意,這個命令是用來切換到D盤目錄下,不同目錄之間切換不需要cd命令,只需輸入盤符即可。
如圖
第一條命令的結果顯示在第二條的cd之前,此時已經是在D盤目錄下了,(從cd開始是另一條命令,這條不管,因爲我已經搭好了環境,這是我搭好的環境目錄)
3、然後輸入cd D:\Anaconda2\Scripts切換到該目錄下,我看好像可以直接輸入目錄名,而不用輸入完整的路徑,這裏我不知道,我也沒試驗,你們可以自己試一下。
//如果你們沒有裝anaconda,那麼大概是這樣子的:
python
這圖是從http://blog.csdn.net/ryanho84/article/details/3838289734盜的,我也參考了一些他的。34是指python3.4版本,第二條就是我剛剛說的那個直接輸入目錄名的。
4、創建項目,輸入:django-admin startproject mysite
創建項目(因爲我之前創的忘了截圖,只好盜用一下這位仁兄的。)
mysite是你的項目名,如圖中的myproject,前面是固定的命令,我創建的名字是web。
如果執行完沒有出錯,則是成功創建了,我的工程名叫web,在Scripts下會生成一個web目錄,目錄中還有一個同名的web目錄和一個manage.py文件,如圖
文件有
也可以輸入tree命令,即可查看內容的樹形結構圖:
tree
它的區別在於它的工程名叫blog,而我的是web
圖片來源:
http://growth-in-action.phodal.com/#django%E5%88%9B%E5%BB%BA%E5%8D%9A%E5%AE%A2%E5%BA%94%E7%94%A8,學Linux的童鞋可以參考這篇文章。
第一個web目錄我們暫且叫它工程文件,以區別第二個,第二個web目錄存放了相關的工程文件, manage.py是用來啓動web服務器的。
web目錄的相關配置:
web目錄的相關配置(也是參考上面那個鏈接的)
這個時候就可以啓動了,啓動命令:python manage.py runserver
但是當時我並沒有成功,因爲端口被佔了,默認的端口是8000端口端口被佔10013就是端口被佔,而我之後查過,8000一般是被酷狗給佔了(如果你有的話)。
那麼有三個解決辦法:
1、別聽歌了,把酷狗給關了,關掉進程。
2、如果你不想關掉酷狗,我Google了一下,把端口號改成8080即可。
即輸入:python manage.py runserver 0.0.0.0:8080即可
2、如果不是酷狗,輸入命令,taskkill /f /t /im 程序名。
這裏寫圖片描述
這裏有兩個命令,“|”號前面的命令是查看所有端口,而 後面那個可以指定端口號,直接查看指定端口是被什麼給佔用了,而它這個是被3180這個進程給佔了,打開資源管理器或者輸入tasklist|findstr “3108”可以查看,而結束就是taskkill /pid 3108,而如果你知道是什麼程序就用taskkill /f /t /im 程序名。
參考來源:https://my.oschina.net/catroll/blog/163447
3、運行時在python manage.py runserver後加上IP和端口號。
python manage.py runserver 0.0.0.0:8000
//如果不加0.0.0.0:8000,默認是127.0.0.1:8000,且只能本機訪問。默認是長這樣的。
端口號被佔了看下面view視圖的實現裏的第5點,
方法就是:python manage.py runserver 端口號
這裏寫圖片描述

三、創建視圖文件
我看了一下網上的教程,有些是在建完項目直接就建APP,而有的教程裏並沒有,我在某個網上看到:項目是針對一個特定的 Web 網站相關的配置和其應用的組合。一個項目可以包含多個應用。一個應用可以在多個項目中使用。鏈接忘了。
後來發現,不管有沒有建APP,都可以在網站上顯示內容。
而創建APP的作用主要是,這個應用可能是一個博客,一個網站,建立了它在運行的時候就不單單只是顯示It worked!了,而是一個完整的網站的內容。
我買了一本《python高效開發實戰》,裏面有python的四大主流框架,包括Django,然後參考了一下http://jingyan.baidu.com/article/84b4f565d09bf360f6da32b3.html

這個是未創建工程前的:
1、1、打開web/web目錄,創建一個view.py文件(對,自己創建,它本來下面只有四個文件,沒有它,它和web/blog/views.py有區別)然後輸入:

#coding:utf8
from django.http import HttpResponse

def hello(req):
    return HttpResponse('hello world!')

2、然後打開web/web/urls.py,修改:
先增加一行:
from web.view import hello #從web/view.py導入hello函數
然後在urlpatterns中加入一行url(r’^hello/’,hello),這樣就可以了。
這裏寫圖片描述
#那個include函數可以導入也可以不用

三、創建工程/應用
1、首先,跳轉到第二個web目錄下,命令:cd web
2、創建工程的命令:python manage.py startapp blog
//blog是我創建的工程名字
這是我的目錄位置和創建APP的命令:
這裏寫圖片描述,沒出錯即成功
blog在web工程下,和web目錄同級,以下是blog的內容
這裏寫圖片描述
結構大概是這樣:
這裏寫圖片描述
解釋一下:
1、其中有一個init.py的文件,另外在blog的APP目錄下也有一個,它裏面都是沒有內容的,只是使得這個APP是一個python包。
2、admin.py:管理站點模型的聲明文件,默認爲空。
3、apps.py:應用信息定義文件
算了,懶得打,用手機把書上的拍一下好了,在電腦上也沒找到。
這裏寫圖片描述
依次是:init.py、admin.py、apps.py、migrations包、models.py、tests.py、views.py,中文你們應該看得清。

四、創建APP後view視圖的實現
1、打開web/blog/views.py,它打開來是這樣的:
這裏寫圖片描述
2、然後建立一個路由響應函數,在web/blog下創建一個views.py文件,管理應用APP中的所有url映射,加入以下內容:

from django.http import HttpResponse
def hello(req):
    return HttpResponse('hello world!')

然後是這個樣的:
這裏寫圖片描述
我們定義了一個hello()函數,簡單地返回一條被HttpResponse()封裝的hello信息。
第一個參數必須是request或者req,與網頁發來的請求有關,可以包含get或post的內容,函數返回一行hello world!到網頁。
參考來源:http://jingyan.baidu.com/article/8ebacdf0ce434a49f65cd5d2.html

另外,這裏要注意,別搞錯,因爲這個我出了問題怎麼都解決不了。我是因爲之前資料不完整,然後將本該是web/blog/views.py和urls.py的內容分別寫在了web/views.py和urls.py裏。而這幾個是有區別的,web/urls.py是自帶的,後面會用到這個文件。生成web的同時自動產生的,而web/blog/urls.py是要我們自己創建的。

3、然後我們打開web/blog下的urls.py 文件,綁定 URL 與視圖函數。
因爲我用的書使用的是2.7版本的,但是我在網上看到的似乎都是3.x版本的,兩個都寫吧。

python2.7#coding:utf8      #python2.x中這個不能少,另一種方式是-*-coding:utf8-*-
#Django中的所有路由映射都由這個url()生成
from django.conf.urls import url
#導入web/blog/view.py模塊
from . import views

#該關鍵變量是一個列表,保存所有由url()函數生成的路由映射。
urlpatterns = [
    #將所有路由映射到views.py中的hello函數
    url(r'',views.hello),
]

------------------------------------------------------------
python3.4#這裏其實需要導入django.conf.urls下的三個模塊,patterns,urls,include,所以也可以寫from django.conf.urls import patterns,urls,include,導入*是爲了麻煩
from django.conf.urls import *
#web.view就是導入web文件夾下的view.py,hello即裏面使用的函數名
#從這裏開始跟python2.7有些不同
from web.view import hello
#3.4好像是用的patterns這個函數,而2.7是列表,不用它,所以比2.7多了一個要導入的模塊
urlpatterns = patterns("",
    ('^hello/$', hello),
)

4、這個時候就切換到web/urls.py了,就是我剛剛說的容易錯的地方,千萬別搞錯
裏面默認是這樣的:
這裏寫圖片描述
然後我們往裏面加,聲明對應用APP中urls.py文件的引用:

from django.conf.urls import include

然後在urlpatterns中增加一項:

#url()的第一個參數用正則表達式來表達url路由,^blog/表示以blog開通的路由
url(r'^blog/',include('blog.urls')),
#書上的解釋是:在urlpatterns增加這個blog/路徑,將其轉接到app.urls包,即web/blog/urls.py文件。這樣通過include()函數就將兩個urlpatterns連接了起來。
#這裏的include函數可以省略,現在已經輸出的是hello函數的內容了,但是若是有其他函數導入則不能省略,會找不到的。但是如果沒有其他函數,只有hello函數,就可以。

不懂正則的去看看python的正則,推薦幾個:
1、http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html(這個是我當時看的,裏面的圖顯得很清楚)
2、http://www.cnblogs.com/chuxiuhong/p/5885073.html
3、http://www.jb51.net/article/15707.htm
4、http://www.runoob.com/python/python-reg-expressions.html

完整代碼如下:
這裏寫圖片描述

5、先啓動內置服務器,在anaconda的命令行裏輸入命令(在web工程下,因爲manage.py 在web目錄下),總共有三種方法:

python manage.py runserver
python manage.py runserver 8080 #修改端口號,默認的是80000.0.0.0表示綁定本機的所有IP)
python manage.py runserver 0.0.0.0:8000 #服務器監聽任意IP的8000端口

參考來自:http://blog.chinaunix.net/uid-10915175-id-5060795.html

這個時候如果出現這個圖,其實差不多已經成功了,
這裏寫圖片描述

6、然後這個時候你打開瀏覽器輸入127.0.0.1:8080/blog(8080是我設置的端口號,blog是我的APP名,你對應修改成自己的就行了)就成功了,或者localhost:8080。如圖:
這裏寫圖片描述

如果你輸入的是127.0.0.1:8080,沒有APP名的話,打開來是page not found ,如下圖:
這裏寫圖片描述
原因我們看命令行,你沒有指定跳轉的目錄就會打開它的根目錄,它的根目錄就是上面那個頁面。
這裏寫圖片描述

當然,出現這個頁面已經成功了。雖然我的不知道爲什麼相比其他人的多了you have 13 unapplied migration…什麼的。

http://www.cnblogs.com/zrl66/p/Django.html的解決辦法:
我們在命令行輸入這麼一句命令:python manage.py migrate,如圖,每條都OK了就可以了。
這裏寫圖片描述
然後你再輸入python manage.py runserver的時候就不會有了。
這裏寫圖片描述


後來我又看到出現page not found的解決方法有兩個:
一是在端口號後加上\blog,另外還有一種方法,參照:http://jingyan.baidu.com/article/84b4f565d09bf360f6da32b3.html
仍舊在web/web/view.py文件增加創建另一個函數:
def homepage(req):
return HttpResponse(‘homepage!’)
這裏寫圖片描述
然後修改web/web/urls.py,做一些修改:

1、先導入homepage函數,在第三行後面加上就行了。
2、加上上面兩個函數
這裏寫圖片描述
現在輸入127.0.0.1:8080就可以打開了,不用在後面加\blog了。
這裏blog和hello他們輸出的內容是一樣的,因爲目前blog/urls.py裏只有一個hello函數,他們輸出的內容是一樣的,只是前面以示區別。
但是如果註釋掉,輸入127.0.0.1:8080\blog就打不開了。

如果端口被佔,用第二種,你只要更改端口號即可。

至此,花了兩個晚上終於成功了。
以上均爲親測,除了創建工程之後顯示的頁面之後都成功了,但是因爲之前出錯了,所以沒顯示。後來直接進行的下一步。


另外,補充一點,之前我的出了這個問題,就是不管怎樣,都報這個錯:UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe3 in position 7: ordinal not in range(128) 。
我之前在網上查的時候,解決方案,大多是這樣的,都是在該python文件的前面加上如下幾句:
import sys
reload(sys)
# Python2.5 初始化後會刪除 sys.setdefaultencoding 這個方法,我們需要重新載入 (‘utf-8’)
sys.setdefaultencoding
原因是:python的str默認是ascii編碼,和unicode編碼衝突。
但是聽說這種方式已經不推薦使用了,推薦使用以下方式 :xxx.decode(“utf-8”) 。
參考來源:https://www.zybuluo.com/zwenqiang/note/21851
或者在你需要使用中文的地方前面加上u.Python2默認的字符串編碼是str。
如果你確實是因爲這個編碼的原因,打開D:\Anaconda2\Lib\mimetypes.py,在254行左右有句default_encoding = sys.getdefaultencoding(),在它前面加上這句:
if sys.getdefaultencoding() != ‘utf8’:
reload(sys)
sys.setdefaultencoding(‘utf8’)
如圖:
這裏寫圖片描述
改完之後就沒事了。

但是我的不是這個原因,因爲加了也沒用,後來發現就是出了我前頭出現的問題,我把web/blog和web/web下的urls.py文件搞混了,重新弄好之後就搞定了。

發佈了29 篇原創文章 · 獲贊 59 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章