Django startproject
1. django-admin command help
d:\django_study>django-admin --help
Type 'django-admin help <subcommand>' for help on a specific subcommand.
Available subcommands:
[django]
check
compilemessages
createcachetable
dbshell
diffsettings
dumpdata
flush
inspectdb
loaddata
makemessages
makemigrations
migrate
runserver
sendtestemail
shell
showmigrations
sqlflush
sqlmigrate
sqlsequencereset
squashmigrations
startapp
startproject
test
testserver
Note that only Django core commands are listed as settings are not properly configured (error: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.).
2. django-admin startproject djangosite #djangosite 是項目名稱
3. 生成項目之后,會生成文件夾 djangosite, djangosite 下包含一個子文件夾 djangosite 和 一個 manage.py 文件
d:\django_study\djangosite 的目錄
2017/12/30 20:12 <DIR> .
2017/12/30 20:12 <DIR> ..
2017/12/30 20:12 <DIR> djangosite
2017/12/30 20:12 830 manage.py
1 個文件 830 字節
3 個目錄 105,486,389,248 可用字節
4. 創建project之后,就可以運行sever來檢驗一下了:
d:\django_study\djangosite>python manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
December 30, 2017 - 20:13:07
Django version 1.11.4, using settings 'djangosite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
注意:
You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
之所以有這個提示,是因為默認設置里面會有應用: admin, auth, contenttypes, sessions , 這些應用包含model,這些model已經有了對應的migrations,可以參加django 源碼:
可以看到這里已經有了migrations,所以才會有這個提示,如果把設置里有關這些應用的設置刪除,就不會再出現這個提示,一般情況下,我們都會用到這些應用,所以不會刪除這些設置,等做完第一次migrate之后,就不會再有這個提示了。
5. 訪問server,打開地址 http://127.0.0.1:8000/, 會出現 It worked! , 說明項目創建成功,接下來就可以創建 應用了
注意:
雖然默認會配置 admin的試圖,但是這個時候因為沒有migrate,沒有對應的數據,訪問 http://127.0.0.1:8000/admin會報錯:
Note: 此時你很可能會看到log里面打印:
"GET /favicon.ico HTTP/1.1" 404
這是因為默認情況下,瀏覽器訪問一個網站的時候,同時還會向服務器請求“/favicon.ico”這個URL,目的是獲取網站的圖標。默認情況下,Django會返回404錯誤的,瀏覽器接收到這個404錯誤后,也無傷大雅,因為沒有圖標就用默認的圖標,所以這個錯誤也沒有跟通常的404錯誤一樣在網頁上顯示出來。
不過我們還是應該給網站配置一個圖標,這樣用戶體驗會更好一些。
配置favicon.ico文件,可以在url.py文件中這樣配置:
# favicon.cio
url(r'^favicon\.ico$', 'django.views.generic.simple.redirect_to', {'url': '/static/images/favicon.ico'}),
不過這個有個前提是在Django中,配置靜態文件的支持。
然后在static/images目錄下放一個名為favicon.ico的圖片就大功告成了。
6. 創建應用
下面創建了一個名為app的應用
d:\django_study\djangosite>python manage.py startapp app
d:\django_study\djangosite>dir
驅動器 D 中的卷沒有標簽。
卷的序列號是 10C5-F5F6
d:\django_study\djangosite 的目錄
2017/12/30 23:37 <DIR> .
2017/12/30 23:37 <DIR> ..
2017/12/30 23:36 <DIR> .idea
2017/12/30 23:37 <DIR> app
2017/12/30 20:13 3,072 db.sqlite3
2017/12/30 22:00 <DIR> djangosite
2017/12/30 20:12 830 manage.py
2 個文件 3,902 字節
5 個目錄 105,486,344,192 可用字節
創建之后,會生成一個名為app的文件夾
d:\django_study\djangosite\app 的目錄
2017/12/30 23:37 <DIR> .
2017/12/30 23:37 <DIR> ..
2017/12/30 23:37 134 admin.py
2017/12/30 23:37 154 apps.py
2017/12/30 23:37 <DIR> migrations
2017/12/30 23:37 128 models.py
2017/12/30 23:37 131 tests.py
2017/12/30 23:37 134 views.py
2017/12/30 23:37 0 __init__.py
6 個文件 681 字節
3 個目錄 105,486,344,192 可用字節
下面的文件名默認是一致的(就是對所有的應用,默認名稱是一樣的),如果要修改,需要手動修改
a. admin.py: 管理站點模型的聲明文件,默認為空,可以在此文件中注冊需要在管理頁面管理(增加,刪除,修改,查看)的模型
b. apps.py: 應用信息定義文件,在其中生成了類 AppConfig, 該類用於定義應用名等 meta 數據
c. migrations包: 用於在之后定義應用遷移功能
d. models.py: 添加模型類的文件
e.tests.py: 單元測試文件
f. views.py: 視圖函數定義文件,用來響應URL請求
以上文件生成的時候,沒有實際內容,需要編碼來實現具體功能。
一個項目中可以創建多個應用,比如再創建一個名為 petstore 的應用:
d:\django_study\djangosite>python manage.py startapp petstore
d:\django_study\djangosite 的目錄
2018/01/01 18:36 <DIR> .
2018/01/01 18:36 <DIR> ..
2018/01/01 18:06 <DIR> .idea
2017/12/30 23:37 <DIR> app
2017/12/30 20:13 3,072 db.sqlite3
2017/12/30 22:00 <DIR> djangosite
2017/12/30 20:12 830 manage.py
2018/01/01 18:36 <DIR> petstore
2 個文件 3,902 字節
6 個目錄 105,486,327,808 可用字節
d:\django_study\djangosite>dir petstore
驅動器 D 中的卷沒有標簽。
卷的序列號是 10C5-F5F6
d:\django_study\djangosite\petstore 的目錄
2018/01/01 18:36 <DIR> .
2018/01/01 18:36 <DIR> ..
2018/01/01 18:36 134 admin.py
2018/01/01 18:36 164 apps.py
2018/01/01 18:36 <DIR> migrations
2018/01/01 18:36 128 models.py
2018/01/01 18:36 131 tests.py
2018/01/01 18:36 134 views.py
2018/01/01 18:36 0 __init__.py
6 個文件 691 字節
3 個目錄 105,486,327,808 可用字節
7. 函數 django.conf.urls.url 和 django.conf.urls.include
函數 django.conf.urls.url 用來根據參數 創建以下類對象, 要么是
RegexURLPattern, 要么是 RegexURLResolver
當參數 view 是可調用函數時, 創建 RegexURLPattern 對象, 如果是 list/tuple, 則創建 RegexURLResolver 對象,
函數 django.conf.urls.include 用來根據參數生成一個tuple,來供url函數創建 RegexURLResolver 對象,這也是為什么 既可以寫成
url(r'^admin/', admin.site.urls), 又可以寫成 url(r'^admin/', include(admin.site.urls)), 的原因, 因為 admin.site.urls 本身是一個tuple, 經過include之后仍然是一個tuple,而且tuple內容沒變,所以兩者都可以,但 url(r'^admin/', include(admin.site.urls)) 是老式寫法,更推薦用 url(r'^admin/', admin.site.urls)
8. INSTALLED_APPS 和 MIDDLEWARE
如果要用到某一個應用的model,就需要在settings的INSTALLED_APPS添加這個應用?
about static files:
settings中關於靜態文件(css,js,img...)的路徑配置是STATIC_URL & STATIC_ROOT & STATICFILES_DIRS, STATIC_URL是關於app,STATIC_ROOT是關於project的:
STATIC_URL: 是app的靜態文件路徑,比如項目里一個app名字為blog,如果設置
STATIC_URL = '/static/'
則這個app里的靜態文件路徑就是類似 http://xxx/blog/static/yy.css, 對應的app里的靜態文件要放在這個文件夾下,不然訪問不到,這個文件要自己創建。
STATIC_URL 對應於模板中的tag: static, 比如:
{% load static %} <img src="{% static "images/hi.jpg" %}" alt="Hi!" />
這里static 就是STATIC_URL的值
注意: 因為django提供的app,比如admin app(后台管理)的static文件都是放在app下的static文件夾里,比如 C:\Python27\Lib\site-packages\django\contrib\admin\static, 所以
STATIC_URL = '/static/' 不要改成別的,不然會訪問不到admin app的靜態文件。
STATIC_ROOT: 是一個項目的靜態文件路徑, 一把指定為項目路徑下的一個文件夾,比如staticfiles,
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
這個文件夾開始時不存在,在執行命令 python manage collectstatic 之后,就會創建這個文件夾,並把項目里所有app里的靜態文件copy到這個文件夾。
d:\django_by_example\mysite>python manage.py collectstatic
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\css\base.css'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\css\changelists.css'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\css\dashboard.css'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\css\fonts.css'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\css\forms.css'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\css\login.css'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\css\rtl.css'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\css\widgets.css'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\fonts\LICENSE.txt'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\fonts\README.txt'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\fonts\Roboto-Bold-webfont.woff'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\fonts\Roboto-Light-webfont.woff'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\fonts\Roboto-Regular-webfont.woff'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\img\calendar-icons.svg'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\img\icon-addlink.svg'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\img\icon-alert.svg'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\img\icon-calendar.svg'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\img\icon-changelink.svg'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\img\icon-clock.svg'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\img\icon-deletelink.svg'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\img\icon-no.svg'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\img\icon-unknown-alt.svg'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\img\icon-unknown.svg'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\img\icon-yes.svg'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\img\inline-delete.svg'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\img\LICENSE'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\img\README.txt'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\img\search.svg'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\img\selector-icons.svg'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\img\sorting-icons.svg'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\img\tooltag-add.svg'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\img\tooltag-arrowright.svg'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\img\gis\move_vertex_off.svg'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\img\gis\move_vertex_on.svg'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\actions.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\actions.min.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\calendar.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\cancel.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\change_form.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\collapse.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\collapse.min.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\core.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\inlines.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\inlines.min.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\jquery.init.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\popup_response.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\prepopulate.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\prepopulate.min.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\prepopulate_init.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\SelectBox.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\SelectFilter2.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\timeparse.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\urlify.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\admin\DateTimeShortcuts.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\admin\RelatedObjectLookups.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\vendor\jquery\jquery.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\vendor\jquery\jquery.min.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\vendor\jquery\LICENSE-JQUERY.txt'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\vendor\xregexp\LICENSE-XREGEXP.txt'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\vendor\xregexp\xregexp.js'
Copying 'C:\Python27\lib\site-packages\django\contrib\admin\static\admin\js\vendor\xregexp\xregexp.min.js'
61 static files copied to 'd:\django_by_example\mysite\staticfiles'.
about ALLOWED_HOSTS
A list of strings representing the host/domain names that this Django site can serve. This is a security measure to prevent HTTP Host header attacks, which are possible even under many seemingly-safe web server configurations.
Values in this list can be fully qualified names (e.g. 'www.example.com'
), in which case they will be matched against the request’s Host
header exactly (case-insensitive, not including port). A value beginning with a period can be used as a subdomain wildcard: '.example.com'
will match example.com
, www.example.com
, and any other subdomain ofexample.com
. A value of '*'
will match anything; in this case you are responsible to provide your own validation of the Host
header (perhaps in a middleware; if so this middleware must be listed first in MIDDLEWARE
).
When DEBUG
is True
and ALLOWED_HOSTS
is empty, the host is validated against ['localhost', '127.0.0.1','[::1]']
.
This validation only applies via get_host()
; if your code accesses the Host
header directly from request.META
you are bypassing this security protection.
ALLOWED_HOSTS: 用來設置這個django項目服務要放在什么地址的服務器上,比如 ['192.168.1.101', '127.0.0.1', 'www.myblog.com'], 則可以通過這三個地址訪問這個django服務,
比如可能在局域網中,直接訪問 http://192.168.1.101:8000,
在本機,直接訪問 http://127.0.0.1:8000(如果 ALLOWED_HOSTS中沒有127.0.0.1,在本機也是無法通過127.0.0.1訪問的,也要通過http://192.168.1.101:8000 訪問),
在外網通過 www.myblog.com:8000訪問
ALLOWED_HOSTS =['192.168.1.101', '127.0.0.1', 'www.myblog.com']\
問題: 在DEBUG=False時,admin app不能訪問靜態文件,如下:
[08/Feb/2018 15:50:00] "GET /admin/login/?next=/admin/ HTTP/1.1" 200 1650
[08/Feb/2018 15:50:00] "GET /static/admin/css/base.css HTTP/1.1" 404 99
[08/Feb/2018 15:50:00] "GET /static/admin/css/login.css HTTP/1.1" 404 100
[08/Feb/2018 15:50:02] "GET /admin/login/?next=/admin/ HTTP/1.1" 200 1650
[08/Feb/2018 15:50:02] "GET /static/admin/css/base.css HTTP/1.1" 404 99
[08/Feb/2018 15:50:02] "GET /static/admin/css/login.css HTTP/1.1" 404 100
[08/Feb/2018 15:50:02] "GET /admin/login/?next=/admin/ HTTP/1.1" 200 1650
[08/Feb/2018 15:50:02] "GET /static/admin/css/base.css HTTP/1.1" 404 99
[08/Feb/2018 15:50:02] "GET /static/admin/css/login.css HTTP/1.1" 404 100