ySJ
|
2.0/chapter18/#97 |
2010-04-26 16:02:23
|
它应该是指向知道如何认证的Python类的Python路径的名字数组。
|
|
ySJ
|
2.0/chapter18/#96 |
2010-04-26 16:01:51
|
认证后台列表在AUTHENTICATION_BACKENDS设置中进行指定。
|
|
ySJ
|
2.0/chapter18/#93 |
2010-04-26 16:01:22
|
当某个人调用 <literal>django.contrib.auth.authenticate()</literal> (如14章中所述)时,Django会尝试对其认证后台进行遍历认证。
|
|
ySJ
|
2.0/chapter18/#88 |
2010-04-26 16:00:46
|
您可以覆盖Diango默认的基于数据库的模式,您还可以使用默认的系统与其他系统进行交互。
|
|
ySJ
|
2.0/chapter18/#78 |
2010-04-26 15:58:25
|
至于其他数据库,外键字段将在假定其为INT列的情况下被自动生成为IntegerField。
|
|
ySJ
|
2.0/chapter18/#71 |
2010-04-26 15:56:32
|
例如,model Book拥有一个针对于model Author的外键,那么后者应该先于前者被定义。如果你想创建一个指向尚未定义的model的关系,那么可以使用包含model名的字符串,而不是model对象本身。
|
|
ySJ
|
2.0/chapter18/#63 |
2010-04-26 15:53:58
|
如果数据库中某个列的名字是Python的保留字(比如pass、class或者for等),inspectdb会在每个属性名后附加上_field,并将db_column属性设置为真实的字段名(也就是pass,class或者for等)。
|
|
ySJ
|
2.0/chapter18/#61 |
2010-04-26 15:52:38
|
Django模型层不要求必须导入你数据库表中的每个列。
|
|
ySJ
|
2.0/chapter18/#60 |
2010-04-26 15:52:14
|
如果你的数据库中的某个字段在Django中找不到合适的对应物,你可以放心的略过它。
|
|
ySJ
|
2.0/chapter18/#58 |
2010-04-26 15:51:52
|
对这要当心,如果必要的话,更改字段类型。
|
|
ySJ
|
2.0/chapter18/#57 |
2010-04-26 15:50:23
|
每一个字段类型,如CharField、DateField, 是通过查找数据库列类型如VARCHAR,DATE来确定的。如果inspectdb无法把某个数据库字段映射到model字段上,它会使用TextField字段进行代替,并且会在所生成model字段后面加入Python注释“该字段类型是猜的”。
|
|
ySJ
|
2.0/chapter18/#52 |
2010-04-26 15:46:49
|
这样一来,你也许希望移除这样的代码行。
|
|
ySJ
|
2.0/chapter18/#51 |
2010-04-26 15:45:36
|
但是,请注意,如果某个model没有主键的话,那么Django会自动为其增加一个id主键字段。
|
|
ySJ
|
2.0/chapter18/#47 |
2010-04-26 15:44:13
|
数据库的每一个表都会被转化为一个model类 (也就是说,数据库的表和model 类之间是一对一的映射)。
|
|
ySJ
|
2.0/chapter18/#40 |
2010-04-26 15:42:27
|
针对这个,下一个节有些好的建议。
|
|
ySJ
|
2.0/chapter18/#39 |
2010-04-26 15:40:50
|
编辑 <literal>mysite/myapp/models.py</literal> 文件以清理生成的 models 并且做一些必要的自定义。
|
|
ySJ
|
2.0/chapter18/#34 |
2010-04-26 15:39:37
|
看一看输出结果以了解inspectdb能做些什么。
|
|
ySJ
|
2.0/chapter18/#33 |
2010-04-26 15:37:59
|
运行命令 <literal>python mysite/manage.py inspectdb</literal>。这将检查<literal>DATABASE_NAME</literal> 数据库中所有的表并打印出为每张表生成的模型类。
|
|
ySJ
|
2.0/chapter18/#31 |
2010-04-26 15:36:55
|
这里我们使用<literal>myapp</literal> 做为应用名。
|
|
ySJ
|
2.0/chapter18/#30 |
2010-04-26 15:36:42
|
通过运行 <literal>python mysite/manage.py startapp myapp</literal> (这里 <literal>myapp</literal> 是你的应用的名字)创建一个Django应用。
|
|
ySJ
|
2.0/chapter18/#26 |
2010-04-26 15:36:09
|
具体的说,要提供 <literal>DATABASE_NAME</literal> , <literal>DATABASE_ENGINE</literal> , <literal>DATABASE_USER</literal> , <literal>DATABASE_PASSWORD</literal> , <literal>DATABASE_HOST</literal> , 和 <literal>DATABASE_PORT</literal> 这些配置信息.。
|
|
ySJ
|
2.0/chapter18/#20 |
2010-04-26 15:34:27
|
两个前提条件是安装了Django和一个传统数据库。
|
|
ySJ
|
2.0/chapter18/#19 |
2010-04-26 15:30:06
|
下面是一个从头开始的针对一个典型的遗留数据库的整合过程。
|
|
ySJ
|
2.0/chapter18/#17 |
2010-04-26 15:29:43
|
<literal>inspectdb</literal>工具自省你配置文件指向的数据库,针对每一个表生成一个Django模型,然后将这些Python模型的代码显示在系统的标准输出里面。
|
|
ySJ
|
2.0/chapter17/#282 |
2010-04-26 15:24:28
|
在下一章<reference name="next chapter" refuri="../chapter18/">next chapter</reference>,我们将讨论如何集成数据库模式等遗留系统,比如你从20世纪八十年代继承下来的数据库模式。
|
|
ySJ
|
2.0/chapter17/#277 |
2010-04-26 15:22:37
|
关于数据库事务处理的更多信息,请参见附录B。
|
|
ySJ
|
2.0/chapter17/#262 |
2010-04-26 15:21:15
|
已在第15章中详细讨论。
|
|
ySJ
|
2.0/chapter17/#253 |
2010-04-26 15:20:47
|
这个中间件激活会话支持功能。
|
|
ySJ
|
2.0/chapter17/#246 |
2010-04-26 15:20:31
|
只有当能够绝对信任 <literal>HTTP_X_FORWARDED_FOR</literal> 值的时候才能够使用这个中间件。
|
|
ySJ
|
2.0/chapter17/#244 |
2010-04-26 15:19:49
|
这是任何人都能够伪造 <literal>HTTP_X_FORWARDED_FOR</literal> 值,而 <literal>REMOTE_ADDR</literal> 又是依据 <literal>HTTP_X_FORWARDED_FOR</literal> 来设置,这就意味着任何人都能够伪造IP地址。
|
|
ySJ
|
2.0/chapter17/#241 |
2010-04-26 15:18:45
|
这个中间件并 <emphasis>不</emphasis> 验证 <literal>HTTP_X_FORWARDED_FOR</literal> 的合法性。
|
|
ySJ
|
2.0/chapter17/#239 |
2010-04-26 15:16:47
|
危险!
|
|
ySJ
|
2.0/chapter17/#237 |
2010-04-26 15:16:30
|
如果站点位于某个反向代理之后,那么每个request的REMOTE_ADDR都被指向127.0.0.1,在这种情况下,这一功能将非常有用。
|
|
ySJ
|
2.0/chapter17/#236 |
2010-04-26 15:14:55
|
在<literal>request.META['HTTP_X_FORWARDED_FOR']</literal>存在的前提下,它根据其值来设置<literal>request.META['REMOTE_ADDR']</literal>。
|
|
ySJ
|
2.0/chapter17/#235 |
2010-04-26 15:14:11
|
前面一段。
|
|
ySJ
|
2.0/chapter17/#234 |
2010-04-26 15:13:19
|
这是我们在“什么是中间件”这一节中所举的例子。
|
|
ySJ
|
2.0/chapter17/#227 |
2010-04-26 15:12:31
|
此外,它也将删除所有针对<literal>HEAD</literal>请求的响应内容,并且为所有请求的响应头设置 <literal>Date</literal> 和 <literal>Content-Length</literal> 域。
|
|
ySJ
|
2.0/chapter17/#227 |
2010-04-26 15:12:25
|
此外,它也将删除所有针对<literal>HEAD</literal>请求的响应内容,并且为所有请求的响应头中设置 <literal>Date</literal> 和 <literal>Content-Length</literal> 域。
|
|
ySJ
|
2.0/chapter17/#225 |
2010-04-26 15:06:53
|
稍前所讨论的通用中间件可用于设置response中的ETag域。
|
|
ySJ
|
2.0/chapter17/#224 |
2010-04-26 15:05:28
|
对 <literal>ETag</literal> 的支持依赖于 <literal>USE_ETAGS</literal> 配置及事先在response头中设置 <literal>ETag</literal> 域。
|
|
ySJ
|
2.0/chapter17/#215 |
2010-04-26 15:01:32
|
比起带宽,人们一般更青睐速度,但是如果你的情形正好相反,尽可启用这个中间件。
|
|
ySJ
|
2.0/chapter17/#212 |
2010-04-26 14:59:59
|
这将极大地减少Web服务器消耗的带宽。
|
|
ySJ
|
2.0/chapter17/#204 |
2010-04-26 14:55:56
|
请注意,还有一个条件化的 <literal>GET</literal> 中间件, 处理Etags并且还有些别的功能,下面马上就会提及。
|
|
ySJ
|
2.0/chapter17/#202 |
2010-04-26 14:54:24
|
如果 <literal>USE_ETAGS</literal> 为 <literal>True</literal> ,Django针对每个请求以MD5算法处理页面内容,从而得到Etag, 在此基础上,Django将在适当情形下处理并返回 <literal>Not Modified</literal> 响应。
|
|
ySJ
|
2.0/chapter17/#199 |
2010-04-26 14:49:53
|
技术上来说,URL <literal>example.com/bar</literal> 与 <literal>example.com/bar/</literal> 及 <literal>www.example.com/bar/</literal> 都互不相同。搜索引擎索引器会把它们区别对待,这样会影响站点在搜索引擎上的排名,所以最好使用正常的URL。
|
|
ySJ
|
2.0/chapter17/#195 |
2010-04-26 14:40:03
|
URLs将会被重定向到含有先导www.的相应URL上。
|
|
ySJ
|
2.0/chapter17/#194 |
2010-04-26 14:39:53
|
如果 <literal>PREPEND_WWW</literal> 为 True , 那些缺少先导www.的
|
|
ySJ
|
2.0/chapter17/#191 |
2010-04-26 14:39:07
|
<emphasis>依据 ``APPEND_SLASH`` 和 ``PREPEND_WWW`` 的设置执行URL重写</emphasis> :如果 <literal>APPEND_SLASH</literal> 为 <literal>True</literal> , 那些尾部没有斜杠的URL将被重定向到添加了斜杠的相应URL,除非path的最末组成部分包含其他部分。
|
|
ySJ
|
2.0/chapter17/#189 |
2010-04-26 14:18:23
|
请注意 <literal>import re</literal> ,因为 <literal>DISALLOWED_USER_AGENTS</literal> 要求其值为已编译的正则表达式(也就是 <literal>re.compile()</literal> 的返回值)。设置文件是标准Python格式,所有你完全可以使用<literal>import</literal>语句。
|
|
ySJ
|
2.0/chapter17/#185 |
2010-04-26 14:16:37
|
<emphasis>禁止对``DISALLOWED_USER_AGENTS`` 列表中设置的user agent访问</emphasis> :一旦提供,这一列表应当由已编译的正则表达式对象组成,这些对象用于匹配传入的request请求头中的user-agent域。
|
|