㈠ django modelbackend是什麼意思
指的是Django後端具體鏈接的資料庫類型,比如SQLite、MySql、Postgrep、Oracle等等。
一般情況下,Django的模型系統也就是ORM是跨資料庫的,所以遷移起來不太費勁。但是個別細節上,可能有細微差別,需要在實際應用中注意。
㈡ django的user用abstractUser繼承來的,為什麼密碼為明文
1. 確定 User Model
我們推薦一下方式來確定某一django項目使用的user model:
# 使用默認User model時
>>> from django.contrib.auth import get_user_model
>>> get_user_model()
# 使用自定義User model時
>>> from django.contrib.auth import get_user_model
>>> get_user_model()
2. 使用settings.AUTH_USER_MODEL
自從django 1.5之後, 用戶可以自定義User model了, 如果需要外鍵使用user model, 官方推薦的方法如下:
在settings中設置AUTH_USER_MODEL:
# settings.py
# 格式為 "."
AUTH_USER_MODEL = "myapp.NewUser"
在models.py中使用
# models.py
from django.conf import settings
from django.db import models
class Article(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL)
title = models.CharField(max_length=255)
還有需要注意的是, 不要在外鍵中使用get_user_model().
3. 自定義 User Model
方法1: 擴展 AbstractUser類
如果你對django自帶的User model剛到滿意, 又希望額外的field的話, 你可以擴展AbstractUser類:
# myapp/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
class NewUser(AbstractUser):
new_field = models.CharField(max_length=100)
不要忘了在settings.py中設置:
AUTH_USER_MODEL = "myapp.NewUser"
方法2: 擴展 AbstractBaseUser類
AbstractBaseUser中只含有3個field: password, last_login和is_active. 如果你對django user model默認的first_name, last_name不滿意, 或者只想保留默認的密碼儲存方式, 則可以選擇這一方式.
方法3: 使用OneToOneField
如果你想建立一個第三方模塊發布在PyPi上, 這一模塊需要根據用戶儲存每個用戶的額外信息. 或者我們的django項目中希望不同的用戶擁有不同的field, 有些用戶則需要不同field的組合, 且我們使用了方法1或方法2:
# profiles/models.py
from django.conf import settings
from django.db import models
from flavors.models import Flavor
class EasterProfile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL)
favorite_ice_cream = models.ForeignKey(Flavor, null=True, blank=True)
class ScooperProfile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL)
scoops_scooped = models.IntergerField(default=0)
class InventorProfile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL)
flavors_invented = models.ManyToManyField(Flavor, null=True, blank=True)
使用以上方法, 我們可以使用user.easterprofile.favorite_ice_cream獲取相應的profile.
使用這一方法的壞處可能就是增加了代碼的復雜性.
㈢ django創建項目怎樣理解
創建項目:
django-admin startproject mysite
2
新建APP(名稱自定):
cd website
python manage.py startapp learn
3
把我們新定義的APP添加到setting.py中的INSTALL_APPS中:
修改vim mysite/settings.py
INSTALLED_APPS = (
'django.contrib.admin', #Django默認。
'django.contrib.auth', #默認身份驗證系統。
'django.contrib.contenttypes', #默認內容類型框架。
'django.contrib.sessions', #默認session框架。
'django.contrib.messages', #默認消息框架
'django.contrib.staticfiles', #默認靜態文件管理框架。
'learn',
)
備註:這一步是干什麼呢? 新建的 app 如果不加到 INSTALL_APPS 中的話, django 就不能自動找到app中的模板文件(app-name/templates/下的文件)和靜態文件(app-name/static/中的文件) 。
4
定義視圖函數:
vim learn/views.py
註:我們定義了一個index()函數,第一個參數必須是request, 與網頁發來的請求有關,可以包含get或post的內容,函數返回一行字到網頁。
5
定義視圖函數相關的URL(網址):
vim mysite/urls.py
6
運行並驗證:
python manage.py runserver 0.0.0.0:8000
注意:如果不加0.0.0.0:8000,默認是127.0.0.1:8000,且只能本機訪問。
訪問驗證:
7
至此,你已經啟動了Django開發伺服器,一個純粹的由 Python 編寫的輕量級 Web 伺服器。Django 內包含了這個伺服器,這樣你就可以迅速開發了,在產品投入使用之前不必去配置一台生產環境下的伺服器 – 例如 Apache 。
注意:**不要** 在任何類似生產環境中使用此伺服器。它僅適用於開發環境。(Django提供的是 Web 框架的業務,而不是 Web 伺服器。)
8
Tip:項目 ( Projects ) vs. 應用 ( apps )
項目與應用之間有什麼不同之處?應用是一個提供功能的 Web 應用 – 例如:一個博客系統、一個公共記錄的資料庫或者一個簡單的投票系統。 項目是針對一個特定的 Web 網站相關的配置和其應用的組合。一個項目可以包含多個應用。一個應用可以在多個項目中使用。
㈣ 在Django models.py,什麼是默認值,空值和空白之間的區別
直接從Django模型欄位參考:Field.null如果True,Django存儲空值NULL在資料庫中。默認值是False。
需要注意的是空字元串值總是會得到存儲為空字元串,而不是NULL。null=True對於非字元串欄位,如整數,布爾和日期。對於這兩種類型的欄位,你還需要設置blank=True如果你希望允許空值的表單,為null僅影響資料庫存儲(見blank)。null關於基於字元串的欄位
CodeGo.net,如CharField和TextField除非你有一個很好的理由。如果一個基於字元串的欄位null=True,它具有「無數據」兩個可能的值:NULL和空字元串。在大多數情況下,它是多餘的,以有兩個可能的值「沒有數據」;
Django的慣例是空字元串,不NULL。Field.blank如果True,該欄位允許為空。默認值是False。
注意,這是比不同null。null純粹是資料庫相關的,而blank為驗證相關。如果一個欄位blank=True,驗證在Django管理站點將允許空值條目。如果一個欄位blank=False,該領域將是必需的。Field.default默認值的欄位。這可以是一個值或一個可調用對象。如果調用它會在每次調用時創建一個新的對象。
難道你不明白這一切?
從文檔:null如果為True,Django存儲空 值NULL,在資料庫中。
默認值為False。blank如果為True,則欄位允許 為空白。默認值為False。default為默認值 場。
你「default「設置將用於該領域的問題應該你的代碼沒有明確將其設置為一個值的值。
使用「blank「表單驗證目的-空白=TRUE將允許欄位設置為空值
使用「null「如果你想存儲一個空值」在DB空「,通常它可是首選,設置空白值設置為空字元串,或(如適用)給定欄位0。
Null =
None Blank = "" Default = "" 大概是因為它得到。 空白意味著它是NOT
NULL,而是具有價值,它表示「空」為數據類型,它在一個字元串的情況下,可能是一個空字元串。對於數字可能是0。
㈤ 如何修改django auth.user 的默認get
#Django#User的urls設置問題在你使用了UserProfile之後將會出現一個問題,就是User Model 的get_absolute_url在django的auth app中默認是/users/<username>/, 如果你已經擴展實現了一個UserProfile的話,你可能需要使用userprofile.get_absolute_url來使用,那麼你需要重新定義auth.user的絕對url了.
auth.models 中的user的get_absolute_url是這樣定義的:
[python] view plain
def get_absolute_url(self):
return "/users/%s/" % urllib.quote(smart_str(self.username))
這里定死了吧,但是django還是給了方法來修改它.
方法就是:在settings.py中增加一個設置:ABSOLUTE_URL_OVERRIDES
[python] view plain
ABSOLUTE_URL_OVERRIDES = {
'blogs.weblog': lambda o: "/blogs/%s/" % o.slug,
'news.story': lambda o: "/stories/%s/%s/" % (o.pub_year, o.slug),
}
所以對auth.user來說,要修改就按照下面的來:
[python] view plain
ABSOLUTE_URL_OVERRIDES = {
'auth.user': lambda u: "/member/profile/%s/" % u.username,
#其他的設置
}
㈥ django session信息加密嗎
驗證 (認證) 用戶是否是他所宣稱的用戶(一般通過查詢資料庫驗證其用戶名和密碼)
驗證用戶是否擁有執行某種操作的 授權 (通常會通過檢查一個許可權表來確認)
根據這些需求,Django 認證/授權 系統會包含以下的部分:
用戶 : 在網站注冊的人
許可權 : 用於標識用戶是否可以執行某種操作的二進制(yes/no)標志
組 :一種可以將標記和許可權應用於多個用戶的常用方法
Messages : 向用戶顯示隊列式的系統消息的常用方法
㈦ Django中,如何為ForeignKey設置默認值最科學
您好,很高興為您解答:
我猜你的意思是使用form為foreignkey設置初始值。如果是這樣的話可以這樣
form.field['some_field_name'].init = '===請選擇選項==='
如果我理解錯了,請完善一下你的問題。
希望以上信息可以幫到您!
㈧ django為什麼默認安裝到3.0而不是2.6
您好,django默認安裝到的是您後裝的python版本,您應該是先裝了2.6後裝了3.0。所以系統默認的是後裝的Python版本也就是3.0,您打開程序的時候其實默認的也是3.0而非2.6,我建議您先卸載3.0,然後安裝django之後再重新安裝3.0。
㈨ 在Django默認的admin目錄問題,怎麼解決
解決辦法!:就是你沒有配置環境變數,Django安裝之後,要配置環境變數才能用命令:django-admin.py startproject 工程名,環境變數的內容就是django-admin.py文件的路徑,我的是在:E:\PythonAll\Python-2.7\Lib\site-packages\Django-1.7.6-py2.7.egg\django\bin,讀者參考,和你的應該有出入,自行核對。
㈩ 哪些網站由django開發,並且有源碼
採用了MVC的軟體設計模式,即模型M、視圖V和控制器C。它最初是被開發來用於管理勞倫斯出版集團旗下的一些以新聞內容為主的網站的,即是CMS(內容管理系統)軟體。並於2005年7月在BSD許可證下發布。
最近在進行網站代碼審查的過程中,發現某些產品由於session使用不當,導致可能被攻擊者利用,執行任意代碼。這些產品在登錄的JS代碼中,泄露了SECRET_KEY,將該值作為密碼加密的鹽,這樣就暴露了加密salt不太好吧,更重要的是對django的安全造成了極大的威脅。
1、SECRET_KEY作用
SECTET_KEY在djanog中使用非常廣泛,基本上涉及到安全,加密等的地方都用到了,下面列舉一些常見情景:
1.json object的簽名 2.加密函數,如密碼重置,表單,評論,csrf的key,session數據
這裡面就要重點講到session的問題,在這里使用不當就會導致代碼執行。
2、代碼執行
2.1 settings的session設置
django默認存儲session到資料庫中,但是可能會比較慢,就會使用到緩存,文件,還有cookie等方式,如果採用了cookie機制則有可能代碼執行,settings配置如下:
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
2.2 django 1.6以下
在django1.6以下,session默認是採用pickle執行序列號操作,在1.6及以上版本默認採用json序列化。代碼執行只存在於使用pickle序列話的操作中。
2.3 session處理流程
可以簡單的分為兩部分,process_request和process_response,前者負責選擇session引擎,初始化cookie數據。見代碼:
class SessionMiddleware(object): def process_request(self, request): engine = import_mole(settings.SESSION_ENGINE) session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)
process_response則是處理返回給用戶的cookie信息,比如修改過期時間等。在將session存入緩存後,可能在某個操作中會用到session信息,這個時候就會通過反序列化操作從緩存中取,如果反序列話引擎是採用pickle機制的話就存在代碼執行。反序列化的代碼位於django.core.signing.py中,這個模塊主要是一些簽名,加解密操作,同時也包含序列化和反序列化,默認採用JSON引擎,下面是反序列話loads的代碼:
def loads(s, key=None, salt='django.core.signing', serializer=JSONSerializer, max_age=None): """ Reverse of mps, raises BadSignature if signature fails """ base64d = smart_str( TimestampSigner(key, salt=salt).unsign(s, max_age=max_age)) decompress = False if base64d[0] == '.': # It's compressed; uncompress it first base64d = base64d[1:] decompress = True data = b64_decode(base64d) if decompress: data = zlib.decompress(data) return serializer.loads(data)