㈠ 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)