Django学习笔记2
Django第一個(gè)簡易項(xiàng)目理解框架
在理解了Django框架的基本目錄結(jié)構(gòu)之后,為了更好的理解框架的流程,我們通過一個(gè)簡易項(xiàng)目來實(shí)踐一下,上面的目錄可總結(jié)為:在templates文件夾中寫前端頁面,在settings中進(jìn)行Django基本配置,在app下的models中寫數(shù)據(jù)庫相關(guān),在url中寫路徑的對應(yīng)關(guān)系,在views中寫請求處理。
下面的項(xiàng)目就對這些文件一個(gè)個(gè)進(jìn)行書寫。
配置相關(guān)
首先是各種配置的書寫,一下都是在setting文件中的配置
1、理解settings文件中的BASE_DIR
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))這句話是獲取項(xiàng)目的根路徑,后面會用到。
2、在最初的時(shí)候先禁用csrf相關(guān)
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware', 在此禁用,一般在setting中的47行左右
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
3、確認(rèn)APP是否注冊
如果是在pycharm中創(chuàng)建的APP,一般都會在setting文件中自動(dòng)注冊,格式如下,如果沒有請手動(dòng)添加
INSTALLED_APPS = ['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'book_system.apps.BookSystemConfig', # 這行是app的注冊語句 book_system是app名 ]
4、配置template文件夾的位置
TEMPLATES = [{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')] # 在此處配置,該DIRS是一個(gè)列表,可以配置多個(gè)
,
'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',
],
},
},
]
5、配置靜態(tài)文件存放的位置(本篇可不用此設(shè)置)
# 靜態(tài)文件保存目錄的別名STATIC_URL = '/static/'
# 所有靜態(tài)文件(css/js/圖片)都放在我下面你配置的文件夾中,同樣是列表,路徑可以多個(gè)
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
6、配置數(shù)據(jù)庫相關(guān)
這里編者是用的mysql數(shù)據(jù)庫,然后連接的數(shù)據(jù)庫名字為'booksystem',
第一步------在settings文件中寫下如下配置,先將原DATABASE注釋掉
DATABASES = {'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'booksystem', # 數(shù)據(jù)庫的名字
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root', # mysql數(shù)據(jù)庫的用戶名
'PASSWORD': 'root', # 密碼
}
}
第二步------告訴Django用pymysql代替默認(rèn)的MySQLDB 連接MySQL數(shù)據(jù)庫
在項(xiàng)目/__init__.py文件中,寫下面兩句:import pymysql
# 告訴Django用pymysql來代替默認(rèn)的MySQLdb
pymysql.install_as_MySQLdb()
恭喜你,至此你的配置環(huán)節(jié)已經(jīng)結(jié)束
數(shù)據(jù)庫和models表的建立
1、自己動(dòng)手創(chuàng)建數(shù)據(jù)庫
create database booksystem;
2、在創(chuàng)建的APP目錄下的models.py下寫下如下類,可在創(chuàng)建的空數(shù)據(jù)庫中創(chuàng)建一系列的表
from django.db import models# Create your models here.# 出版社類 class Publisher(models.Model):id = models.AutoField(primary_key=True) # 自增的ID主鍵# 創(chuàng)建一個(gè)varchar(64)的唯一的不為空的字段name = models.CharField(max_length=64, null=False, unique=True)def __str__(self):return "<Author object>: {}".format(self.name)# 書類 class Book(models.Model):id = models.AutoField(primary_key=True)# 創(chuàng)建一個(gè)varchar(64)的唯一的不為空的字段tittle = models.CharField(max_length=64, null=False, unique=True)# 和出版者關(guān)聯(lián)的外鍵字段publisher = models.ForeignKey(to="Publisher") # 設(shè)置書籍連接到出版者的外鍵# 數(shù)據(jù)庫自動(dòng)生成的外鍵會自動(dòng)加上_iddef __str__(self):return "<Author object>: {}".format(self.tittle)# 作者類 class Author(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=16, null=False, unique=True)book = models.ManyToManyField(to="Book") # 創(chuàng)建作者表和書籍表多對多的關(guān)系# 多對多的關(guān)系會在數(shù)據(jù)庫中另創(chuàng)建一個(gè)新的對應(yīng)關(guān)系表,只存放id的對應(yīng)關(guān)系def __str__(self):return "<Author object>: {}".format(self.name)3、使創(chuàng)建的表結(jié)構(gòu)通過django命令映射到數(shù)據(jù)庫
(1). python manage.py makemigrations --> 把models.py里面的更改記錄到小本本(相應(yīng)APP的migrations文件夾下)
(2). python manage.py migrate? ? ? ? ? ? ? --> 把更改翻譯成SQL語句,去數(shù)據(jù)庫執(zhí)行、
如果在pycharm環(huán)境中可以選擇Tools-->Run manage.py task,然后會在下方彈出如下界面
在后面輸入makemigration [appname]和migrate?[appname]可以達(dá)到和如上一樣的結(jié)果,執(zhí)行完畢會在對應(yīng)的數(shù)據(jù)庫下創(chuàng)建各種表
3、自動(dòng)創(chuàng)建的數(shù)據(jù)表在數(shù)據(jù)庫中的結(jié)構(gòu)如下
四個(gè)主要的表結(jié)構(gòu)如下所示
到這,數(shù)據(jù)庫結(jié)構(gòu)的創(chuàng)建已經(jīng)結(jié)束,向表中填寫數(shù)據(jù)即可使用
url的路徑關(guān)系及處理函數(shù)
1、數(shù)據(jù)庫構(gòu)建完成后,我們著手于對訪問地址的解析,寫url的路徑關(guān)系
"""bookdjango URL ConfigurationThe `urlpatterns` list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/1.11/topics/http/urls/ Examples: Function views1. Add an import: from my_app import views2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views1. Add an import: from other_app.views import Home2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf1. Import the include() function: from django.conf.urls import url, include2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ from django.conf.urls import url from django.contrib import admin from book_system import viewsurlpatterns = [url(r'^admin/', admin.site.urls),# 出版社的對應(yīng)關(guān)系url(r'^publisher_list/', views.publisher_list),url(r'^add_publisher/', views.add_publisher),url(r'^delete_publisher/', views.delete_publisher),url(r'^edit_publisher/', views.edit_publisher),# 書的對應(yīng)關(guān)系url(r'^book_list/', views.book_list),url(r'^add_book/', views.add_book),url(r'^delete_book/', views.delete_book),url(r'^edit_book/', views.edit_book),# 作者的對應(yīng)關(guān)系url(r'^author_list/', views.author_list),url(r'^add_author/', views.add_author),url(r'^delete_author/', views.delete_author),url(r'^edit_author/', views.edit_author),url(r'^author_list1/', views.author_list1),] 與項(xiàng)目目錄同名的目錄下的urls文件中代碼url函數(shù)的第一個(gè)參數(shù)為正則表達(dá)式,匹配接收的網(wǎng)址路徑,匹配上了就交給后面第二個(gè)參數(shù)的函數(shù)處理
我們這里的函數(shù)寫在了APP目錄下的views模塊里,也就是book_system中,根據(jù)需要把import那一行導(dǎo)入改成自己的APP
2、有了路徑解析函數(shù),下面寫請求處理函數(shù)
在book_system下的views.py中寫下路徑處理函數(shù)
from django.shortcuts import render, redirect, HttpResponse from book_system import models# Create your views here.def publisher_list(request):# 去數(shù)據(jù)庫查出所有的出版社,填充到html中,給用戶界面ret = models.Publisher.objects.all().order_by("id")return render(request, "publisher_list.html", {"publisher_list": ret})def add_publisher(request):error_msg = ""if request.method == "POST":new_name = request.POST.get("publisher_name")if new_name:models.Publisher.objects.create(name=new_name)return redirect("/publisher_list/")else:error_msg = "出版社的名字不能為空"return render(request, "add_publisher.html", {"error": error_msg})def delete_publisher(request):del_id = request.GET.get("id")if del_id:del_obj = models.Publisher.objects.get(id=del_id) # 這里的id相當(dāng)于where語句 del_obj.delete()return redirect("/publisher_list/")else:return HttpResponse("您要?jiǎng)h除的數(shù)據(jù)不存在")def edit_publisher(request):if request.method == "POST":publisher_id = request.POST.get("id")publisher_name = request.POST.get("publisher_name")publisher = models.Publisher.objects.get(id=publisher_id)publisher.name = publisher_namepublisher.save()return redirect("/publisher_list/")else:edit_id = request.GET.get("id")print(models.Publisher.objects)edit_obj = models.Publisher.objects.get(id=edit_id)return render(request, "edit_publisher.html", {"edit_obj": edit_obj})# book的相關(guān)試圖操作 def book_list(request):# 去數(shù)據(jù)庫查出所有的書籍,填充到html中,給用戶界面ret = models.Book.objects.all().order_by("id")return render(request, "book_list.html", {"book_list": ret})def add_book(request):error_msg = ""ret = models.Publisher.objects.all()if request.method == "POST":new_name = request.POST.get("book_name")new_publisher_id = request.POST.get("publisher")if new_name:models.Book.objects.create(tittle=new_name, publisher_id=new_publisher_id)return redirect("/book_list/")else:error_msg = "書本的名字不能為空"return render(request, "add_book.html", {"error": error_msg,"publisher_list": ret})def delete_book(request):del_id = request.GET.get("id")if del_id:del_obj = models.Book.objects.get(id=del_id) # 這里的id相當(dāng)于where語句 del_obj.delete()return redirect("/book_list/")else:return HttpResponse("您要?jiǎng)h除的數(shù)據(jù)不存在")def edit_book(request):ret = models.Publisher.objects.all()if request.method == "POST":book_id = request.POST.get("id")book_tittle = request.POST.get("book_tittle")book_publisher_id = request.POST.get("publisher")book = models.Book.objects.get(id=book_id)book.tittle = book_tittlebook.publisher_id = book_publisher_idbook.save()return redirect("/book_list/")else:edit_id = request.GET.get("id")print(models.Book.objects)edit_obj = models.Book.objects.get(id=edit_id)return render(request, "edit_book.html", {"edit_obj": edit_obj,"publisher_list": ret})def author_list(request):all_author = models.Author.objects.all()return render(request, "author_list.html", {"author_list": all_author})def add_author(request):error_msg = ""ret = models.Book.objects.all()if request.method == "POST":new_name = request.POST.get("author_name")new_books_id = request.POST.getlist("books")if new_name:new_book_obj = models.Author.objects.create(name=new_name)new_book_obj.book.set(new_books_id) # 自動(dòng)保存,不用savereturn redirect("/author_list/")else:error_msg = "作者的名字不能為空"return render(request, "add_author.html", {"error": error_msg,"book_list": ret})def delete_author(request):del_id = request.GET.get("id")if del_id:models.Author.objects.get(id=del_id).delete() # 這里的id相當(dāng)于where語句return redirect("/author_list/")else:return HttpResponse("您要?jiǎng)h除的數(shù)據(jù)不存在")def edit_author(request):if request.method == "POST":old_id = request.POST.get("author_id")old_obj = models.Author.objects.get(id=old_id)new_name = request.POST.get("author_name")new_books_id = request.POST.getlist("books")print(new_books_id)# 更新old_obj.name = new_nameold_obj.book.set(new_books_id) # 自動(dòng)保存,不用save old_obj.save()return redirect("/author_list/")edit_author_id = request.GET.get("id")edit_author_obj = models.Author.objects.get(id=edit_author_id)ret = models.Book.objects.all()return render(request, "edit_author.html", {"author": edit_author_obj,"book_list": ret,})def author_list1(request):return render(request, "author_list1.html") APP目錄下的views.py中的代碼有了路徑處理函數(shù)還遠(yuǎn)遠(yuǎn)不夠,還需要html文件來配合顯示
3、一下文件再都存放在項(xiàng)目根目錄下的templates目錄下
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>添加作者</title> </head> <body> <h1>添加作者信息</h1> <form action="/add_author/" method="post"><p>姓名:<input type="text" name="author_name"></p><p>著作:<select multiple name="books">{% for book in book_list %}<option value="{{ book.id }}">{{ book.tittle }}</option>{% endfor %}</select></p><input type="submit" value="提交"><p style="color: red;">{{ error }}</p> </form> </body> </html> add_author.html <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>添加書籍</title> </head> <body> <h1>添加書籍信息</h1> <form action="/add_book/" method="post"><p>書名:<input type="text" name="book_name"></p><p><select name="publisher">{% for publisher in publisher_list %}<option value="{{ publisher.id }}">{{ publisher.name }}</option>{% endfor %}</select></p><input type="submit" value="提交"><p style="color: red;">{{ error }}</p> </form> </body> </html> add_book.html <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> <h1>添加出版社</h1> <form action="/add_publisher/" method="post"><input type="text" name="publisher_name"><input type="submit" value="提交"><p style="color: red;">{{ error }}</p> </form> </body> </html> add_publisher.html <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>作者列表</title> </head> <body> {# a標(biāo)簽指向的位置找的也是urls.py文件中的對應(yīng)關(guān)系的key。并不是直接找同級目錄下的文件#} <a href="/add_author/">添加新的作者信息</a> <table border="1"><thead><tr><th>ID</th><th>姓名</th><th>作品</th><th>操作</th></tr></thead><tbady>{% for author in author_list %}<tr><td>{{ author.id }}</td><td>{{ author.name }}</td><td>{% for book in author.book.all %}{{ book.tittle }} {% endfor %}</td><td><a href="/delete_author/?id={{ author.id }}">刪除</a><a href="/edit_author/?id={{ author.id }}">編輯</a></td></tr>{% endfor %}</tbady> </table> </body> </html> author_list.html <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>書籍列表</title> </head> <body> {# a標(biāo)簽指向的位置找的也是urls.py文件中的對應(yīng)關(guān)系的key。并不是直接找同級目錄下的文件#} <a href="/add_book/">添加新的書籍信息</a> <table border="1"><thead><tr><th>ID</th><th>書名</th><th>出版社名稱</th><th>操作</th></tr></thead><tbady>{% for book in book_list %}<tr><td>{{ book.id }}</td><td>{{ book.tittle }}</td><td>{{ book.publisher.name }}</td><td><a href="/delete_book/?id={{ book.id }}">刪除</a><a href="/edit_book/?id={{ book.id }}">編輯</a></td></tr>{% endfor %}</tbady> </table> </body> </html> book_list.html <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>編輯作者</title> </head> <body> <h1>編輯作者信息</h1> <form action="/edit_author/" method="post"><input type="text" name="author_id" value="{{ author.id }}" style="display: none"> {{ author.id }}<p>姓名:<input type="text" name="author_name" value="{{ author.name }}"></p><p>著作:<select multiple name="books">{% for book in book_list %}{% if book in author.book.all %}<option selected value="{{ book.id }}">{{ book.tittle }}</option>{% else %}<option value="{{ book.id }}">{{ book.tittle }}</option>{% endif %}{% endfor %}</select></p><input type="submit" value="提交"><p style="color: red;">{{ error }}</p> </form> </body> </html> edit_author.html <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>編輯書籍信息</title> </head> <body> <h1>編輯書籍信息</h1> <form action="/edit_book/" method="post"><input type="text" name="id" value="{{ edit_obj.id }}" style="display: none;"><p><input type="text" name="book_tittle" value="{{ edit_obj.tittle }}"></p>{# <input type="text" name="publisher_name" value="{{ edit_obj.name }}">#}<p><select name="publisher">{% for publisher in publisher_list %}{% if edit_obj.publisher_id == publisher.id %}<option selected value="{{ publisher.id }}">{{ publisher.name }}</option>{% else %}<option value="{{ publisher.id }}">{{ publisher.name }}</option>{% endif %}{% endfor %}</select></p><input type="submit" value="提交"><p style="color: red;">{{ error }}</p> </form> </body> </html> edit_book.html <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>編輯出版社</title> </head> <body> <h1>編輯出版社</h1> <form action="/edit_publisher/" method="post"><input type="text" name="id" value="{{ edit_obj.id }}" style="display: none;"><input type="text" name="publisher_name" value="{{ edit_obj.name }}"><input type="submit" value="提交"><p style="color: red;">{{ error }}</p> </form> </body> </html> edit_publisher.html <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>出版社列表</title> </head> <body> {# a標(biāo)簽指向的位置找的也是urls.py文件中的對應(yīng)關(guān)系的key。并不是直接找同級目錄下的文件#} <a href="/add_publisher/">添加新的出版社</a> <table border="1"><thead><tr><th>序號</th><th>ID</th><th>出版社名稱</th><th>操作</th></tr></thead><tbady>{% for publisher in publisher_list %}<tr><td>{{ forloop.counter }}</td><td>{{ publisher.id }}</td><td>{{ publisher.name }}</td><td><a href="/delete_publisher/?id={{ publisher.id }}">刪除</a><a href="/edit_publisher/?id={{ publisher.id }}">編輯</a></td></tr>{% endfor %}</tbady> </table> </body> </html> publisher_list.html此時(shí)可以點(diǎn)運(yùn)行,看看成果了,在8000后面加上下方數(shù)字后面的list即可操作書籍系統(tǒng)
Django中各種路徑的尋址
1、網(wǎng)頁地址欄
類似于在網(wǎng)頁地址欄中輸入127.0.0.1:8000/publisher_list/,尋找的是項(xiàng)目同名目錄下的urls.py中的urlpatterns列表
urlpatterns = [url(r'^admin/', admin.site.urls),# 出版社的對應(yīng)關(guān)系url(r'^publisher_list/', views.publisher_list),# 書的對應(yīng)關(guān)系url(r'^book_list/', views.book_list),# 作者的對應(yīng)關(guān)系url(r'^author_list/', views.author_list), ]url函數(shù)的第一個(gè)參數(shù)為正則表達(dá)式,表示匹配127.0.0.1:8000/后面的路徑,然后尋找相應(yīng)的路徑處理函數(shù),這里有一個(gè)注意的地方就是在瀏覽器輸入尾部帶斜線和不帶斜線的路徑時(shí),都能匹配到結(jié)果,例如:輸入127.0.0.1:8000/publisher_list?和?127.0.0.1:8000/publisher_list/?時(shí)都能匹配到url(r'^publisher_list/', views.publisher_list),這不是因?yàn)闉g覽器會自動(dòng)補(bǔ)全,是因?yàn)镈jango中默認(rèn)配置會補(bǔ)全斜線如果在settings.py中加入APPEND_SLASH = False,這時(shí),地址欄訪問就不會自動(dòng)補(bǔ)全斜線。
2、views.py里render返回時(shí)尋址
render(request, "publisher_list.html", {"publisher_list": ret})render函數(shù)第二個(gè)參數(shù)為settings中TEMPLATES列表"DIRS"下面路勁的相對路徑
3、views.py里render返回時(shí)尋址
redirect("/publisher_list/")重定向函數(shù),和第一點(diǎn)一樣,尋找的是項(xiàng)目同名目錄下的urls.py中的urlpatterns列表
4、html文件中form表單action尋址
和第一點(diǎn)一樣,尋找的是項(xiàng)目同名目錄下的urls.py中的urlpatterns列表
5、html文件中a標(biāo)簽尋址
和第一點(diǎn)一樣,尋找的是項(xiàng)目同名目錄下的urls.py中的urlpatterns列表
6、img和script下的src和link下的href
這兩者一般都會帶有靜態(tài)文件的別名,一般去settings文件下STATIC_URL去尋找
Django配置文件settings詳解
ADMINS
默認(rèn)值:[ ](空列表)
所有獲得代碼錯(cuò)誤通知的人的郵件地址列表。當(dāng)DEBUG=False,并且一個(gè)視圖引發(fā)了異常時(shí),Django將會給這個(gè)列表里的人發(fā)一封含有完整異常信息的電子郵件。列表中的每個(gè)項(xiàng)目都應(yīng)該是(全名,電子郵件地址)的元組。例如:
[('John', 'john@example.com'), ('Mary', 'mary@example.com')]ALLOWED_HOSTS
默認(rèn)值:[ ](空列表)
這是新手比較困惑的一個(gè)配置項(xiàng)。該配置項(xiàng)列表中包含的是Django站點(diǎn)可以為之提供服務(wù)的主機(jī)/域名。也就是哪些主機(jī)或IP能夠訪問Django服務(wù)器!列表里的所有元素是同級的,并存的
列表中的值可以是localhost、www.example.com或者.example.com形式的域名。
也可以是IP地址,比如:137.2.4.1、192.168.1.1、0.0.0.0、127.0.0.1
還可以是通配符’*’,表示所有外部主機(jī)都可以訪問Django。但這種情況具有安全風(fēng)險(xiǎn),在線上環(huán)境不要使用。
對于0.0.0.0,表示局域網(wǎng)內(nèi)的主機(jī)都可以訪問Django。
當(dāng)DEBUG為True和ALLOWED_HOSTS為空時(shí),默認(rèn)相當(dāng)于配置:[‘localhost’, ‘127.0.0.1’, ‘[:: 1]’]。--------------127.0.0.1(IPv4)和[::1](IPv6)。
APPEND_SLASH
默認(rèn)值:True
當(dāng)設(shè)定為True時(shí),如果請求的URL沒有匹配到URLconf里面的任何一條URL路由設(shè)置,并且沒有以/(斜杠)結(jié)束,該請求將重定向到以請求URL加/的URL地址。需要注意的是重定向有可能導(dǎo)致POST提交的數(shù)據(jù)丟失。
APPEND_SLASH設(shè)置只有在安裝了CommonMiddleware中間件時(shí)才會啟用。
DATABASES
# 數(shù)據(jù)庫配置 DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql', # 數(shù)據(jù)庫驅(qū)動(dòng)名'NAME': 'mydatabase', # 數(shù)據(jù)庫名稱'USER': 'mydatabaseuser', # 用戶名'PASSWORD': 'mypassword', # 密碼'HOST': '127.0.0.1', # 數(shù)據(jù)庫所在的主機(jī)。'PORT': '3306', # 端口號} }其中ENGINE指定使用的數(shù)據(jù)庫后端。 內(nèi)建的數(shù)據(jù)庫后端名稱有:
'django.db.backends.postgresql' 'django.db.backends.mysql' 'django.db.backends.sqlite3' 'django.db.backends.oracle'Django默認(rèn)使用sqlite數(shù)據(jù)庫,以文件的形式存在。當(dāng)使用sqlite為數(shù)據(jù)庫時(shí)只需要配置上述NAME屬性為數(shù)據(jù)庫文件的完整路徑。指定路徑時(shí),請始終使用前向的斜杠,即使在Windows 上(例如C:/homes/user/mysite/sqlite3.db)。
DEBUG
打開/關(guān)閉調(diào)試模式。最重要的設(shè)置之一!默認(rèn)值是False,你沒有看錯(cuò)!只是在settings.py中又幫我們設(shè)置為True了,打開了調(diào)試模式,方便開發(fā)者和測試者的!線上部署網(wǎng)站的時(shí)候務(wù)必設(shè)置為False。
調(diào)試模式下可以顯示錯(cuò)誤頁面的細(xì)節(jié)。若你的應(yīng)用產(chǎn)生了一個(gè)異常,Django會顯示追溯細(xì)節(jié),包括許多環(huán)境變量的元數(shù)據(jù), 比如所有當(dāng)前定義的Django設(shè)置。
DEFAULT_CHARSET
默認(rèn)值:’utf-8’
HttpResponse響應(yīng)對象的默認(rèn)字符集。
DEFAULT_CONTENT_TYPE
默認(rèn)值:’text/html’
HttpResponse對象的默認(rèn)內(nèi)容類型。
DEFAULT_FROM_EMAIL
默認(rèn)值:’webmaster@localhost’
默認(rèn)的電子郵件發(fā)送地址,即發(fā)送方。
INSTALLED_APPS
Django核心配置項(xiàng)!
當(dāng)前Django項(xiàng)目中啟用的app列表。 每個(gè)元素應(yīng)該是一個(gè)Python的點(diǎn)分路徑,字符串格式:
項(xiàng)目內(nèi)每個(gè)啟用的app,包括Django內(nèi)置的contrib都必須在這個(gè)列表里注冊,否則創(chuàng)建數(shù)據(jù)表、調(diào)用功能等等都無法進(jìn)行。
一個(gè)典型的配置如下:
# app注冊 INSTALLED_APPS = ['app1', # 將自定義模塊注冊到項(xiàng)目中'app2', # 將自定義模塊注冊到項(xiàng)目中'django.contrib.admin', # admin站點(diǎn)'django.contrib.auth', # 身份認(rèn)證系統(tǒng)'django.contrib.contenttypes', # 內(nèi)容類型框架'django.contrib.sessions', # 會話框架'django.contrib.messages', # 消息框架'django.contrib.staticfiles', # 靜態(tài)文件管理框架 ]LANGUAGE_CODE
默認(rèn)值:’en-us’
當(dāng)前項(xiàng)目所使用的語言。默認(rèn)為英語。漢語是zh-hans,千萬不要寫成別的,比如‘chinese’之類!
USE_I18N必須設(shè)置為True才能使LANGUAGE_CODE生效。
TIME_ZONE
默認(rèn):’America/Chicago’
時(shí)區(qū)設(shè)置。
注意,這個(gè)配置項(xiàng)的值不一定要和服務(wù)器的時(shí)區(qū)一致。例如,一個(gè)服務(wù)器可上可能有多個(gè)Django站點(diǎn),每個(gè)站點(diǎn)都有一個(gè)單獨(dú)的時(shí)區(qū)設(shè)置。
如果要設(shè)為中國時(shí)間,也就是北京時(shí)間,請賦值:TIME_ZONE = ‘Asia/Shanghai’。注意是上海,不是北京,囧!
當(dāng)USE_TZ為False時(shí),它將成為Django存儲所有日期和時(shí)間數(shù)據(jù)時(shí),使用的時(shí)區(qū)。 當(dāng)USE_TZ為True 時(shí),它是Django顯示模板中的時(shí)間,解釋表單中的日期,使用的時(shí)區(qū)。所以,通常我們都將USE_TZ同時(shí)設(shè)置為False!
注:在Windows 環(huán)境中,Django不能可靠地交替其它時(shí)區(qū)。如果你在Windows上運(yùn)行Django,TIME_ZONE必須設(shè)置為與系統(tǒng)時(shí)區(qū)一致。
MEDIA_ROOT
默認(rèn)值:”(空字符串)
用戶上傳的文件,所在目錄的,文件系統(tǒng)絕對路徑。也就是指示上傳文件放到哪里。
例如: “/var/www/example.com/media/”
警告:MEDIA_ROOT和STATIC_ROOT必須設(shè)置為不同的值。
MEDIA_URL
默認(rèn)值:”(空字符串)
MEDIA_URL指向MEDIA_ROOT所指定的media文件,用來管理保存的文件。該URL設(shè)置為非空值時(shí),必須以斜杠“/”結(jié)束。
若你打算在模版中使用{{ MEDIA_URL }},必須在TEMPLATES的context_processors設(shè)置中添加django.template.context_processors.media。
警告:MEDIA_URL和STATIC_URL必須設(shè)置為不同的值。
SECRET_KEY
當(dāng)前Django項(xiàng)目實(shí)例的密鑰。用于提供cryptographic簽名,是一個(gè)唯一的并且不可預(yù)測的值。
TEMPLATES
Django模板系統(tǒng)相關(guān)的配置。列表中每一項(xiàng)都是一個(gè)字典類型數(shù)據(jù)(類似DATABASE配置),可以配置模板不同的功能。
示例如下
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [], # DIRS:定義了一個(gè)目錄列表,模板引擎按列表順序搜索這些目錄以查找模板源文件。'APP_DIRS': True, # APP_DIRS:告訴模板引擎是否應(yīng)該進(jìn)入每個(gè)已安裝的應(yīng)用中查找模板。通常請將該選項(xiàng)保持為True。# OPTIONS中包含了具體的后端設(shè)置。'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',],},}, ]BACKEND:要使用的模板后端。 內(nèi)置模板后端有:
'django.template.backends.django.DjangoTemplates' 'django.template.backends.jinja2.Jinja2'通過將BACKEND設(shè)置為完全限定路徑(即’mypackage.whatever.Backend’),你可以使用第三方提供的模板后端。
OPTIONS中包含了具體的后端設(shè)置。
由于絕大多數(shù)引擎都是從文件加載模板的,所以每種模板引擎都包含兩項(xiàng)通用設(shè)置:
- DIRS:定義了一個(gè)目錄列表,模板引擎按列表順序搜索這些目錄以查找模板源文件。
- APP_DIRS:告訴模板引擎是否應(yīng)該進(jìn)入每個(gè)已安裝的應(yīng)用中查找模板。通常請將該選項(xiàng)保持為True。
每種模板引擎后端都定義了一個(gè)慣用的名稱作為應(yīng)用內(nèi)部存放模板的子目錄名稱。(例如Django為它自己的模板引擎指定的是 ‘templates’,為jinja2指定的名字是‘jinja2’)。尤其是,django允許你有多個(gè)模板引擎后端實(shí)例,且每個(gè)實(shí)例有不同的配置選項(xiàng)。 在這種情況下你必須為每個(gè)配置指定一個(gè)唯一的NAME .
DTL引擎的OPTIONS配置項(xiàng)中接受以下參數(shù):
- ‘a(chǎn)utoescape’:一個(gè)布爾值,用于控制是否啟用HTML自動(dòng)轉(zhuǎn)義功能。默認(rèn)為True。
- context_processors:上下文處理器,以”.”為分隔符的Python調(diào)用路徑的列表。默認(rèn)是個(gè)空列表。
- ‘debug’:打開/關(guān)閉模板調(diào)試模式的布爾值。默認(rèn)和setting中的DEBUG有相同的值。
- ‘loaders’:模板加載器類的虛擬Python路徑列表,每個(gè)模板加載器知道如何從特定的源來導(dǎo)入模板。默認(rèn)值取決于DIRS和APP_DIRS的值。
- string_if_invalid:非法變量時(shí)輸出的字符串。默認(rèn)為空字符串。
- file_charset:用于讀取磁盤上的模板文件的字符集編碼。默認(rèn)為FILE_CHARSET的值。
- ‘libraries’:用于注冊模板引擎。 這可以用于添加新的庫或?yàn)楝F(xiàn)有庫添加備用標(biāo)簽,標(biāo)簽庫可以在{%?load?%}標(biāo)記中傳入相應(yīng)的字典鍵值進(jìn)行載入。
- ‘builtins’:將模板標(biāo)簽庫加入內(nèi)建庫中,無需調(diào)用{%?load?%}就可使用。 OPTIONS={'builtins': ['myapp.builtins'], }
USE_I18N
默認(rèn)值:True
這是一個(gè)布爾值,指定Django的翻譯系統(tǒng)是否開啟。如果設(shè)置為False,Django會做一些優(yōu)化,不去加載翻譯機(jī)制。
USE_L10N
默認(rèn)值:False
一個(gè)布爾值,用于決定是否開啟數(shù)據(jù)本地化。如果此設(shè)置為True,例如Django將使用當(dāng)前語言環(huán)境的格式顯示數(shù)字和日期。
USE_TZ
默認(rèn)值:False
一個(gè)布爾值,用來指定是否使用指定的時(shí)區(qū)(TIME_ZONE)的時(shí)間。若為True, 則Django會使用內(nèi)建的時(shí)區(qū)的時(shí)間;否則, Django將會使用本地的時(shí)間。
如果我們將TIME_ZONE設(shè)置成了Asia/Shanghai, 那么務(wù)必同時(shí)將USE_TZ改成False!
SESSION_EXPIRE_AT_BROWSER_CLOSE
默認(rèn)值:False
是否在用戶關(guān)閉瀏覽器時(shí)過期會話。
STATIC_ROOT
默認(rèn)值:None
在DEBUG設(shè)置為False時(shí),也就是線上環(huán)境時(shí),Django項(xiàng)目里的靜態(tài)文件(js\css\plugins)會無法使用。這是,需要運(yùn)行python manage.py collectstatic,將靜態(tài)文件統(tǒng)一收集到一個(gè)目錄下。STATIC_ROOT配置的就是該目錄的絕對路徑。
示例:”/var/www/example.com/static/”
這個(gè)目錄,剛開始應(yīng)該是一個(gè)空目錄。
STATIC_URL
默認(rèn)值:None
引用位于STATIC_ROOT中的靜態(tài)文件時(shí)使用的網(wǎng)址。
示例:”/static/”或”http://static.example.com/”
該URL設(shè)置為非空值時(shí),必須以斜杠“/”結(jié)束。
WSGI_APPLICATION
默認(rèn)值:None
Django的內(nèi)置服務(wù)器(例如runserver)將使用的WSGI應(yīng)用程序?qū)ο蟮耐暾鸓ython路徑。
Django使用WSGI協(xié)議與外部進(jìn)行通信。
由django-admin startproject xxx命令創(chuàng)建的Django項(xiàng)目,將自動(dòng)創(chuàng)建一個(gè)簡單的wsgi.py模塊,里面有一個(gè)可調(diào)用的application變量,WSGI_APPLICATION配置項(xiàng)的值就指向這個(gè)application變量。
MIDDLEWARE
要使用的中間件列表。Django-admin命令創(chuàng)建的新項(xiàng)目中,settings.py文件里默認(rèn)會為MIDDLEWARE配置項(xiàng)添加一系列Django內(nèi)置的中間件,我們保持它不變就好了。
注釋掉MIDDLEWARE 中的’django.middleware.csrf.CsrfViewMiddleware’,因?yàn)檫@句話會進(jìn)行校驗(yàn),容易產(chǎn)生403錯(cuò)誤。
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',# 'django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware', ]添加自己的配置項(xiàng)
如果要添加自己的配置項(xiàng),需遵循以下準(zhǔn)則:
配置項(xiàng)名稱必須全為大寫。
不要使用一個(gè)已經(jīng)存在的設(shè)置
?
---------------------
總目錄https://www.cnblogs.com/wlx97e6/p/9143284.html
轉(zhuǎn)載于:https://www.cnblogs.com/wlx97e6/p/9563135.html
總結(jié)
以上是生活随笔為你收集整理的Django学习笔记2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序项目实战知识点总结(swipe
- 下一篇: [SHOI2014] 概率充电器