第三章 视图和URL配置

leejaen 02-21 03:18

这一章翻译的句子太不通顺,很多语序都是英语的~

omytea 06-02 15:25

view翻译成视图真的有必要么... 这一章里view就没管过什么跟ui有关的事情 都是整理需要输出的数据 把view翻译成视图 还不如干脆把url也翻译成网址算了

Patrick Cai 06-16 12:34

可以到这里看最新版http://www.djangobook.com/en/2.0/chapter03.html

华仔 08-20 02:58

汉语好难懂吖

PPKK 03-03 03:30

版主做得相当出色! 希望大家一起来完善,而不是自以为是地只知道批评!

beizi1732 03-13 06:49

同意,建议指出具体建议,而不是来笼统点评

root 05-29 07:15

https://docs.djangoproject.com/en/1.6/intro/reusable-apps/#your-project-and-your-reusable-app

longdd 07-04 02:16

这一章很重要

独进青楼 11-28 06:30

我觉得翻译的挺好的,基本一次就看懂了,也不是特别难懂,就是显示的有点问题,要是能修复就更好了

匿名读者 08-16 16:51

来闪耀暖暖找我 by 张一驰

Hongjia 07-09 05:51

我是不是生活照20世纪90年代,看到的网页全TM是文字,连个图片都没有???

对标题的评论会显示在这里

前一章中,我们解释了如何建立一个 Django 项目并启动 Django 开发服务器。 在这一章,你将会学到用Django创建动态网页的基本知识。

对这一段的评论会显示在这里

你的第一个基于Django的页面: Hello World

对这一段的评论会显示在这里

Hello world.

王阳明 12-16 02:47

'Hello Workd' or 'Hello world'

李狗蛋 12-18 03:44

test

Ea5ter 12-07 12:26

你好,你好

对这一段的评论会显示在这里

如果你曾经发布过Hello world页面,但是没有使用网页框架,只是简单的在hello.html文本文件中输入Hello World,然后上传到任意的一个网页服务器上。 注意,在这个过程中,你已经说明了两个关于这个网页的关键信息: 它包括(字符串 "Hello world")和它的URL( http://www.example.com/hello.html , 如果你把文件放在子目录,也可能是 http://www.example.com/files/hello.html)。

匿名读者 11-01 09:26

fff

对这一段的评论会显示在这里

使用Django,你会用不同的方法来说明这两件事 页面的内容是靠view function(视图函数) 来产生,URL定义在 URLconf 中。首先,我们先写一个Hello World视图函数。

wang 07-26 02:58

还行的

对这一段的评论会显示在这里

第一份视图:

对这一段的评论会显示在这里

在上一章使用django-admin.py startproject制作的mysite文件夹中,创建一个叫做views.py的空文件。这个Python模块将包含这一章的视图。 请留意,Django对于view.py的文件命名没有特别的要求,它不在乎这个文件叫什么。但是根据约定,把它命名成view.py是个好主意,这样有利于其他开发者读懂你的代码,正如你很容易的往下读懂本文。

Xiaodong 01-30 05:41

view.py -> view.py

Frank Fang 02-02 06:57

view.py -> views.py

way 06-12 01:16

view.py -> views.py

linpython 02-14 07:34

第三行的view.py要改成views.py才能跟后文搭配,不然也引起导入模块错误

zz 07-15 05:32

问个弱智问题,怎么创建view.py。。。

arnk 12-19 12:15

回LS $ touch views.py

xlaok 07-10 16:39

明明是views.py,正文少了个s,找了好半天的错误

leejaen 02-21 03:10

好像在1.4.0版本以后的mysite目录中有两层文件夹:/mysite:【/mysite:【init.py,settings.py,urls.py,wsgi.py】manage.py】,这views.py的目录到底在哪没有交代清楚

Wing_shine 02-27 12:09

回LS,放在里面一层的mysite里,你可以这样理解,外面一个mysite是一个工程,里面是一个站点,在站点里面可以创建应用。

zhoudeqiang 03-11 05:36

这里一定要标明是在urls.py同级的目录下创建views.py。不然一直错啊。

click 05-23 14:54

不是说对于view.py的文件命名没有特别的要求吗?LS怎么说一定要views.py

Jahangir 08-08 08:05

晕死了,views.py必须要放在里面一层的mysite目录,跟urls.py同级,希望注明,不然一直错到底,都不知道哪出了问题

Ritsu 10-14 01:04

感谢楼上所有人的提醒 谢谢

nwahlk 10-15 09:33

感谢大家的讨论,真心喜欢这样的学习方式

Tanlet 10-16 03:27

强烈要求注明views.py必须要放在里面一层的mysite目录,跟urls.py同级。新版的是两层目录 mysite: manage.py mysite: views.py ...... 不然很容易让我们这些新手误会

杨韬 01-21 02:28

弄了好久才发现views.py应该在mysite/mysite/文件夹下,楼上正解

Septic 04-24 11:02

还好我看了评论

月光轩辕 05-19 06:51

views.py 应该放在第二层的mysite下, 评论真心 有用 赞一个

loveSummer 06-07 05:01

请问怎么创建view.py 视图函数?

匿名读者 07-13 14:25

感谢楼上好人提醒, 有点看弹幕的感觉。

匿名读者 03-29 03:04

楼上正解

soledad 04-09 12:07

这种评注的小插件很有用啊,自己搭博客怎么用这个

dream 08-23 10:37

一定要放到mysite/mysite 目录,因为只有后一级中含有__init__.py,import 引入的是后一级的模块,至于是view.py还是views.py无关紧要,只要和url中的import的引入py文件同名就可

dream 08-23 10:42

一定要放到mysite/mysite 目录,因为只有后一级中含有__init__.py,import 引入的是后一级的模块,至于是view.py还是views.py无关紧要,只要和url中的import的引入py文件同名就可 当然也可以直接去掉mysite , from view import hello ,只因view.py在mysite/mysite 目录中

匿名读者 01-21 13:01

这里的view到底是需不需要添加s好像和url配置有关吧。

古月禾刀 07-20 13:17

查了好久的资料怎么创建view.py,才发现有评注,晕晕,我们这种超级菜鸟伤不起。感谢评注给这个问题解答的朋友们。

匿名读者 08-16 16:50

吾乃黑色幸存者是也! by 张一驰

对这一段的评论会显示在这里

我们的Hello world视图非常简单。 这些是完整的函数和导入声明,你需要输入到views.py文件:

IIssNan 10-25 05:48

Yang Lian 12-01 04:25

请注意Hello World的大小写

Taburiss 04-24 16:05

ls 为什么大小写很重要

scar_l 07-18 07:12

大小写没所谓吧?

蒸笼 12-04 11:36

请问一下:为什么我没生成views.pyc,并且页面上显示错误“name 'hello' is not defined”我明明是按照上面一步步来的呀

starof 03-20 05:12

@ls你的urls里要先导入hello视图

彭天天 04-23 15:14

def hello(request): 冒号不能掉

古月禾刀 07-20 13:33

弱弱的问下,如何打开和修改views.py文件?

流星雨 03-08 01:03

request 参数作用,必填

对这一段的评论会显示在这里
from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello world")
对这一段的评论会显示在这里

我们逐行逐句地分析一遍这段代码:

对这一段的评论会显示在这里

首先,我们从 django.http 模块导入(import) HttpResponse 类。参阅附录 H 了解更多关于 HttpRequestHttpResponse 的细节。 我们需要导入这些类,因为我们会在后面用到。

aisensiy 07-02 04:10

请问附录在哪里呀~

Ozzy 10-04 13:46

同问?附录在哪?

TankyWoo 04-30 03:52

django.http是不是应该称为“包”更合适?

keroro 08-27 06:10

应该称为“模块”, 包 > 模块 > 函数 '>'表包含关系

jj 10-31 05:28

request是否可以是别的值呢?

zlleah 12-18 03:16

附录在The Django Book1.0版本讲解上有,网址是http://djangobook.py3k.cn/

buseses 01-23 18:50

应用“你的第一个URLconf”代替“Your First URLconf”

Agel 07-17 02:06

怎么 没有附录啊,求上传啊,谢谢

linxi 08-01 08:33

附录在这:http://djangobook.py3k.cn/appendixH/

meng 02-26 08:21

meng 02-26 08:22

hello_wonderful_beautiful_world,哪里难看了

对这一段的评论会显示在这里

接下来,我们定义一个叫做hello 的视图函数。

对这一段的评论会显示在这里

每个视图函数至少要有一个参数,通常被叫作request。 这是一个触发这个视图、包含当前Web请求信息的对象,是类django.http.HttpRequest的一个实例。在这个示例中,我们虽然不用request做任何事情,然而它仍必须是这个视图的第一个参数。

spider 08-11 03:01

request可以是其他名字,只是习惯性的命名成request而已

对这一段的评论会显示在这里

注意视图函数的名称并不重要;并不一定非得以某种特定的方式命名才能让 Django 识别它。 在这里我们把它命名为:hello,是因为这个名称清晰的显示了视图的用意。同样地,你可以用诸如:hello_wonderful_beautiful_world,这样难看的短句来给它命名。 在下一小节(Your First URLconf),将告诉你Django是如何找到这个函数的。

对这一段的评论会显示在这里

这个函数只有简单的一行代码: 它仅仅返回一个HttpResponse对象,这个对象包含了文本“Hello world”。

对这一段的评论会显示在这里

这里主要讲的是: 一个视图就是Python的一个函数。这个函数第一个参数的类型是HttpRequest;它返回一个HttpResponse实例。为了使一个Python的函数成为一个Django可识别的视图,它必须满足这两个条件。 (也有例外,但是我们稍后才会接触到。

Z 09-28 01:44

少右括号

Brilliant 06-25 07:09

少右括号

alex 10-10 02:42

能不能详细点?

问号 12-30 08:04

哪两个条件?有点模糊的说……

keetron 01-05 07:37

原文是two things,不知道为什么翻译成条件= =

匿名读者 03-17 07:34

这都看不懂?

rexora 05-03 13:09

一个条件是函数参数是HttpRequest实例 另一个条件是返回HttpResponse实例?

lujingfei 11-03 13:51

1.接收HttpRequest 2.输出HttpResponse

hehe 12-16 06:49

为什么必须要那个参数哦

zen 04-24 23:26

少右括弧+1

durant 07-28 01:24

少右括号加一

对这一段的评论会显示在这里

你的第一个URLconf

对这一段的评论会显示在这里

现在,如果你再运行:python manage.py runserver,你还将看到Django的欢迎页面,而看不到我们刚才写的Hello world显示页面。 那是因为我们的mysite项目还对hello视图一无所知。我们需要通过一个详细描述的URL来显式的告诉它并且激活这个视图。 (继续我们刚才类似发布静态HTML文件的例子。现在我们已经创建了HTML文件,但还没有把它上传至服务器的目录。)为了绑定视图函数和URL,我们使用URLconf。

对这一段的评论会显示在这里

URLconf 就像是 Django 所支撑网站的目录。 它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间的映射表。 你就是以这种方式告诉 Django,对于这个 URL 调用这段代码,对于那个 URL 调用那段代码。 例如,当用户访问/foo/时,调用视图函数foo_view(),这个视图函数存在于Python模块文件view.py中。

Frank Fang 02-02 06:59

view.py -> views.py

juju 08-05 17:50

如何在pyDEV中实现呢?

依云 08-22 10:10

“xxx-powered”一般译为“由 xxx 驱动”。

ivt 04-16 01:18

我觉得点击开注释后,再点击页面的其他地方后,注释自动消失最好。每次都要点击关闭才可以

linxi 08-01 08:58

建议同ls,另外移动评论窗口时,窗口未能时时移动,必须要移到目标位置并松开鼠标后窗口才会跟随。望改进,加油!

周明辉 11-13 14:00

为什么 我的第一个hello world 按照这个来 显示URL找不到

匿名读者 07-06 02:56

如果能将注释设置显示在左侧边栏就好。不会挡住正文,这样都不需要关闭。

对这一段的评论会显示在这里

前一章中执行 django-admin.py startproject 时,该脚本会自动为你建了一份 URLconf(即 urls.py 文件)。 默认的urls.py会像下面这个样子:

对这一段的评论会显示在这里
from django.conf.urls.defaults import *

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()

urlpatterns = patterns('',
    # Example:
    # (r'^mysite/', include('mysite.foo.urls')),

    # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
    # to INSTALLED_APPS to enable admin documentation:
    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    # (r'^admin/', include(admin.site.urls)),
)
xxs2010 08-14 06:52

在高版本的django中,第一句为:from django.conf.urls import patterns, include, url

hekun 07-27 00:13

出现错误: AttributeError at /hello 'str' object has no attribute 'resolve' Request Method: GET Request URL: http://127.0.0.1:8000/hello Django Version: 1.5.1 Exception Type: AttributeError Exception Value: 'str' object has no attribute 'resolve' Exception Location: /usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py in resolve, line 321

hekun 07-27 00:48

应该是笔误,把这段重新复制一遍就可以了。

小菜 12-28 07:28

1.7.1中urls.py导入了两个包,分别是from django.conf.urls import patterns,include,url from django.contrib import admin

Vincent 06-18 05:30

django2.8 """mysite URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.8/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf 1. Add an import: from blog import urls as blog_urls 2. Add a URL to urlpatterns: url(r'^blog/', include(blog_urls)) """ from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^admin/', include(admin.site.urls)), ]

lsj8924 10-25 15:51

from django.conf.urls.defaults import * 这行代码在新版django已经用不了了,必须把default去掉。改为 from django.conf.urls import * 然后一切正常。

chg_self 07-14 06:01

较高的版本为: from django.conf.urls import url,include from django.contrib import admin

对这一段的评论会显示在这里

默认的URLconf包含了一些被注释起来的Django中常用的功能,仅仅只需去掉这些注释就可以开启这些功能. 下面是URLconf中忽略被注释的行后的实际内容

对这一段的评论会显示在这里
from django.conf.urls.defaults import *

urlpatterns = patterns('',
)
裕波 05-15 02:31

在django 1.4中的,urls.py 中第一行后面的 * 为patterns, include,url

yz 05-29 10:57

django 1.3.1也和楼上一样

tsui 11-29 08:50

django1.6同

笑歌 05-22 07:39

新的第一行为 from django.conf.urls import patterns, include, url

Harry 12-13 03:50

Django 1.6.1 的 urls.py 的第一行为: from django.conf.urls import patterns, include, url

seek 10-02 14:11

没关系,指定导入的东西更精确而已

匿名读者 05-22 03:52

1.8 变成 from django.conf.urls import include, url

蒋狗 08-24 14:51

from django.conf.urls import url from django.contrib import admin

Ink 05-31 09:44

Django1.10中urlpatterns与之前有所不同,是以 urlpatterns=[ url(r'^admin/', include(admin.site.urls)), url(........), ] 的形式,也就是说这里应该修改为: urlpatterns = [ url('^hello/$', hello), ]

Yan 12-15 03:44

django1.11.8: from django.conf.urls import url from django.contrib import admin

嫩〇 05-08 09:54

#最新 from django.contrib import admin from django.urls import path urlpatterns = [ path('admin/', admin.site.urls), ]

对这一段的评论会显示在这里

让我们逐行解释一下代码:

对这一段的评论会显示在这里
  • 第一行导入django.conf.urls.defaults下的所有模块,它们是Django URLconf的基本构造。 这包含了一个patterns函数。
  • 第二行调用 patterns() 函数并将返回结果保存到 urlpatterns 变量。patterns函数当前只有一个参数—一个空的字符串。 (这个字符串可以被用来表示一个视图函数的通用前缀。具体我们将在第八章里面介绍。)
yogiman 12-12 15:56

此处标注,后文将提及

ming 10-14 09:57

urlpatterns 是一个数组

对这一段的评论会显示在这里

当前应该注意是 urlpatterns 变量, Django 期望能从 ROOT_URLCONF 模块中找到它。 该变量定义了 URL 以及用于处理这些 URL 的代码之间的映射关系。 默认情况下,URLconf 所有内容都被注释起来了——Django 应用程序还是白版一块。 (注:那是上一节中Django怎么知道显示欢迎页面的原因。 如果 URLconf 为空,Django 会认定你才创建好新项目,因此也就显示那种信息。

andersc 06-24 08:16

当前应该注意的是

sheena yang 10-07 19:41

"因此也就显示那种信息" sounds funny

soilblack 11-14 05:36

ROOT_URLCONF 定义于项目setting.py文件中 ROOT_URLCONF = 'mysite.urls'

对这一段的评论会显示在这里

如果想在URLconf中加入URL和view,只需增加映射URL模式和view功能的Python tuple即可. 这里演示如何添加view中hello功能.

yang 08-14 05:38

tuple和元组混用

对这一段的评论会显示在这里
from django.conf.urls.defaults import *
from mysite.views import hello

urlpatterns = patterns('',
    ('^hello/$', hello),
)
匿名读者 12-04 14:56

('^hello/$', 'hello') 少了''

小强 01-15 12:04

hello 是 从第二中的语句中导出的“对象”

YOng 04-18 16:03

好像Django book 2rd不适合Django1.3,悲催~

liu sicong 05-11 17:47

Oh , My God.

chhxxc 05-18 12:41

('^hello/$', 'hello') 是不是要改成('^hello/$', 'mysite.views.hello')?指向views的hello?

Alan 05-21 03:04

Yes, change 'hello' to 'mysite.views.hello', everything is OK now.

Alan 05-21 03:41

More information: It seems that you have to keep at least 1 up level name space. For example, you can import mysite, and use 'views.hello', but you can't import mysite.views to use 'hello'. Of course, at anytime, you can use full name space like 'mysite.views.hello'.

Alan 05-21 03:59

Jesus! The original setting works: from mysite.views import hello ('^hello/$', hello),

herock 05-31 07:36

就找书中写法即可,没有问题

yodfz 09-01 02:38

如果No module named mysite.urls 检查一下自己的setting.py文件 其中有一行是 ROOT_URLCONF = 'mysite.urls' 如果你是驼峰命名法的爱好者请将这里的mysite修改为正确的模式 我不知道这个算不算一个BUG.

KennX 10-24 04:35

我的错误是:Exception Value:No module named views 于是我把 from mysite.views import hello 改成 from mysite.view import hello

jhting 11-12 14:01

1.3里这里可以使用一个url的function了,url的参数就就和这里的tuple对应的使用.在1.3里也是可以用这个方式的。 eg: url('^hello/$',hello)

jhting 11-12 14:06

('^hello/$',hello) 或 ('^hello/$',“view.hello”) 用字符串的话,需要加上这个所在模块的名称哦 hello可以用一个字符串,也要以不加

青天揽日月 03-15 04:52

默认的mysite已经改为home了吗?

terry 04-05 16:40

此处的from mysite.views import hello 实际上应该是from views import hello 害我试了半天,我说怎么加载不了模块儿呢。靠。官网也是这么写的。

lastmayday 05-12 12:09

from view import hello 就可以了

mr 07-14 02:12

Using the URLconf defined in mysite.urls, Django tried these URL patterns, in this order: ^hello/$ The current URL, , didn't match any of these. How to solve this error?

slee 08-08 13:31

django 1.4/python 2.7 import有错误,可改为(hello为函数对象) import views / views.hello 或者import views.hello / hello 修改源文件后,不需要重启server,重新编译代码,直接refresh网页即可。 设置APPEND_SLASH = False */hello url不能访问 ,/hello/

xxs2010 08-14 07:24

这段代码没有问题,在django1.4下运行也没有问题。若出错,请检查你所建的目录方式是不是和上文描述的一样;views.py你是不是写成了view.py;在浏览器地址栏中输入的地址是否为:127.0.0.1:8000/hello/

tedsun 08-20 02:58

注意,浏览器下输入地址一定要是http://localhost:8000/hello/ 地址为http://localhost:8000时会提示错误

louis 09-18 07:44

第二行 from mysite.views import hello 运行的时候一直提示没有views这个module,改成: from views import hello 保存后,访问http://127.0.0.1:8000/hello/ 能够成功显示hello word 视图。。

易枭寒 09-25 08:32

这么 ('^hello/$', 'mysite.views.hello'), 写可以成功显示‘hello world’.

weifeng 11-01 09:06

我的也报错,不过后来发现是前面定义hello world的时候写错了。

lizi 01-10 02:13

坑爹阿,('^hello/$',hello),没有少''. 加了''的话会有str is not callable这种错误

李根 05-06 02:10

python2.7 django1.5.1 from view import hello 好用

程文 05-22 07:35

('^hello/$',hello) -------我按文章得过程走了一遍,发现去掉第一个hello及后面得“/”后,才能运行正常

笑歌 05-22 08:12

按照文章走下来,没发现错误,不知道为什么楼上的都说有错误,难道是版本的问题?

Marine 05-26 11:42

"from view import hello" works!According to the original writing, it warns "NO module names view"

JohnChen 06-04 04:58

('^hello/?$', hello),建议这里多个问号会更灵活,表示“/”允许出现0次或1次; 因为不是所有人都喜欢http://10.1.1.1:8000/hello/这样打开连接;有些人习惯http://10.1.1.1:8000/hello这样,后面不带“/”

Simon 06-06 13:52

提示'^hello/$'的原因是应该为127.0.0.1:8000/hello

匿名读者 06-24 13:00

记得一定要导入包(第二句话)

K 07-10 05:12

python 2.7 django 1.5 表示按本章教程做没有问题

xiaochao 07-25 11:35

应该配置为这个,否则找不到(r'^hello$','mysite.views.hello'),

xiaochao 07-25 11:36

应该配置为这个(r'^hello$','mysite.views.hello'), 否则报错,是NameError,说找不到hello

李嘉燊 08-08 04:00

完全按这里说的走,一切正常。

Jahangir 08-08 08:06

晕死了,views.py必须要放在里面一层的mysite目录,跟urls.py同级,希望注明,不然一直错到底,都不知道哪出了问题

sam lee 12-18 04:42

1、URL 中的正確代碼是: from django.conf.urls import * from mysite.views import hello urlpatterns = patterns('', # Examples: # url(r'^$', 'mysite.views.home', name='home'), # url(r'^blog/', include('blog.urls')), ('^hello/$',hello), )

Harry 12-21 17:00

Mac Django 下正确的urls.py 内容为: from django.conf.urls import * from mysite.views import hello urlpatterns = patterns('', ('^hello/$','mysite.views.hello'),)

Harry 12-21 17:02

第2次尝试,发现严格按照教程来写,能正确显示 Hello,World

CY 01-04 00:18

django 1.6 第一样需要:from django.conf.urls import patterns, include, url 才能成功,来回折腾验证了。

Aurora 01-10 09:06

('^hello/$', hello)->(r'^hello/$', hello)能够显示“Hello world”了

cjyfff 01-12 14:21

在django1.6中,按照例子写成: url(r'^hello/$', 'mysite.views.hello',name='hello')或者 url(r'^hello/$', 'mysite.views.hello')都可以

NeuSimon 01-16 13:52

from view import hello 就可以了,真心的,不管你views在哪个mysite文件夹都可以

@lastmayday 正确 01-27 06:31

@lastmayday 正确

陈群锋 01-30 08:22

这里可以将('^hello/$',hello)中的第二个hello改为'mysite.views.hello',然后去掉第二句from也可以运行

Flyme 02-09 13:50

教程写的没错 完全按教程走 可以出来hello world 不知道为什么楼上都喊着错了

aoi sora 02-19 15:27

我的版本1.6。。看了下注释里的例子,教程里的这个现在前面要加url才能用,这个地方也可以这么写。。 可以去掉这句from mysite.views import hello 然后下面url('^hello/$,' 'mysite.views.hello') 或者可以上面的这么写from mysite import views 下面url('^hello/$', views.hello)

ross 02-23 15:46

拷贝的时候不要加上hello不要包含在include里面

大问题 02-25 06:52

我是from mysite.view import hello可以运行 但是from view import hello 不等运行 可我不明白为什么 明明 view.py 和url.py 在同一个目录中啊

大问题 02-25 06:56

我是from mysite.view import hello可以运行 但是from view import hello 不等运行 可我不明白为什么 明明 view.py 和url.py 在同一个目录中啊 我明白了 目录是C:\web\mysite\mysite 而Python Path: ['C:\\web\\mysite',..] 也就是说它不能在当前目录里import 我用的是1.6

lee 02-26 08:45

ImportError at /hello/ No module named defaults

lovelan 03-01 00:01

在django 1.5和1.6中view.py要和urls.py文件放在同一个目录下, urls.py中写 from 文件夹名.view import hello url(r'^hello/$' , hello), 或者直接写 url(r'^hello/$' , '文件夹名.view.hello' , name = 'hello'),d

PPKK 03-03 04:51

xxs2010 2012-08-14 15:24:54 说的很对 这段代码没有问题,在django1.4下运行也没有问题。若出错,请检查你所建的目录方式是不是和上文描述的一样;views.py你是不是写成了view.py;在浏览器地址栏中输入的地址是否为:127.0.0.1:8000/hello/ 我就是没有在在浏览器地址栏的地址:127.0.0.1:8000后没有加/hello

PPKK 03-03 04:55

第4行: ('^hello/$', hello), 也可以如官网的写成: url(r'^hello/$', hello), 都没问题.

ryan 03-27 13:48

上面说的都是shit,不是这样试过来试过去就弄好了的,也不是改个名字就弄好了。原理是sys.path里面没有views.py所在的那个目录的路径,设上就好了

Septic 04-24 11:43

按书写,无问题

tips 05-22 05:18

我想说的是from mysite.views import hello#views.py 在books目录下,隶属于books的一个视图而不是在mysite目录下,这个一直跟着教程做下来的话from mysite.views import hello应该改成from books.views import hello,反正我是这么改一下就对了的看这里的意思应该是mysite目录下应该还有个叫做mysite的app子目录,教程在开始的时候命名就是books,所以我觉得这里应该是books

python2.7&Django1.6.5 06-20 03:32

我使用python和django1.6.5发现按照文中描述的去写报No module named defaults Exception Location: ******mysite/mysite/urls.py in <module>, line 1Exception Location: /Users/ruanhongbo/Documents/python/Django_free/mysite/mysite/urls.py in <module>, line 1 然后去Django安装目录urls下查看果然发现无defaults文件,最后将导入包改为django.conf.urls.__init__ 便可成功。希望大家遇到此类问题都能解决。

ld 06-25 02:28

这个主要输url输入错误,要输入 127.0.0.1:8080/hello/

iewgnaw 08-01 02:28

大家都说了这么多,怎么就没人讲一下原理呢?只是按照别人的方式改好了,还是不懂啊

haeckel 08-11 10:48

python 2.7 + django 1.6.5 不要被patterns函数中自带的那个url(r'^admin/',include(admin.site.urls))影响,这里要写url(r'^Hello/', Hello)或者 (r'^Hello/', Hello)

haeckel 08-11 10:48

当然Hello是我自己起的名字

jude 08-27 15:03

python 2.7 + django 1.6.6 按照文中提示新建的 mysite 文件目录下还有一个 mysite 目录,先看看自己的 python 搜索路径有没有包含 mysite,没有的话还是乖乖的把 views.py 与 urls.py 放在同一个目录下。

周陈斌 09-26 06:50

1 可以写成作者这样,导入hello函数,然后使用 2 当然,也可以这样('^hello/$','myapp.views.hello'),加上引号,不用导入

seek 10-02 14:43

高版本 1.6-1.7请修改为from views import hello, urlpatterns=patterns('',(r'^hello/$',hello))

RobinChan 10-10 09:44

这里确实是一个让人纠结的地方。 上面的有些方法也是可以用的,这是我自己参考注释改出来的urls.py下面的代码。直接127.0.0.1:8000下就直接显示helloworld。 代码 from django.conf.urls import patterns, include, url #from view import hello urlpatterns = patterns('', # Examples: # url(r'^$', 'mysite.views.home', name='home'), # url(r'^blog/', include('blog.urls')), #url(r'^admin/', include(admin.site.urls)), url(r'^$', 'mysite.view.hello', name='hello'), #(r'^hello/$', hello) )

RobinChan 10-10 09:45

这里确实是一个让人纠结的地方。 上面的有些方法也是可以用的,这是我自己参考注释改出来的urls.py下面的代码。直接127.0.0.1:8000下就直接显示helloworld。 代码 from django.conf.urls import patterns, include, url urlpatterns = patterns('', # Examples: # url(r'^$', 'mysite.views.home', name='home'), url(r'^$', 'mysite.view.hello', name='hello'), )

b7e3 10-23 07:59

django 1.8 直接在原注释上修改为url(r'^$', 'mysite.view.hello', name='hello'),

瞿祥轩 10-29 01:14

我的是1.7,确实404,然后用力楼上方法,直接匹配了,不输hello,成功了,求讲解

learningDjangoBook 11-07 10:37

from django.conf.urls import patterns, include, url Django 1.7 把第一行改成这个就可以了

小菜 12-28 07:53

1.7.1中的urls.py下,指定/hello/到对应视图hello的tuple为url(r'^hello/$',hello)

pangpangwang 01-07 08:37

使用django1.8版本,urls.py中写成如下即可: from django.conf.urls import url, include urlpatterns = [ url(r'^$', 'mysite.views.hello'), ]

muru 02-22 13:06

太感谢了,爱你们

liuhang 04-29 09:32

from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ # Examples: url(r'^$', 'mysite.views.hello', name='hello'), # url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)), ] django1.8亲测

拉风小伙 05-04 13:34

一直不成功,看了这个手册里的例子:https://docs.djangoproject.com/en/1.8/topics/http/urls/ 第一个import 换成 from django.conf.urls import url即可,不知道为什么,还是官方手册好点吧

tabshi 05-22 14:31

1.8.1 from django.conf.urls import include, url from django.contrib import admin import views urlpatterns = [ url(r'^admin/', include(admin.site.urls)), url(r'^hello/$',views.hello) ] 成功运行

bikegcy 07-14 08:23

django-1.8.3 python-2.7.9 只改 urlpatterns = [ url('^hello/$', 'mysite.views.hello') ] 在“http://127.0.0.1:8000/hello/”下运行成功

希望我能为大家解答疑惑 09-18 03:26

从根本上来说,你的服务是从 mysite 文件下的manage开始的。也就是说mysite是根目录,Django的sys.path路径里面有包括当前目录,也就是~/mysite。所以from mysite.views import hello 查找的是~/mysite/mysite/views 如果你的views在这个目录下,就找得到。如果没有就报错。

hzcortex 11-02 02:14

@loguis 肯定不能用 mysite,比如说我的 project 名称是 temp ,那么 from temp.views import hello 和 import views 是一致的。具体参见 Python 的模块环节

lee 11-06 04:32

2015-11-6 使用anaconda安装django urls.py中应使用以下代码: from views import *

许泽明 02-03 10:02

Django1.6.8 test 图例版本太低 #################3 rom django.conf.urls import * from mysite.views import hello urlpatterns = patterns('', ('^hello/$', hello), )

TomatoFish 03-12 18:04

Python3,Django1.8: 根据urls.py顶部给出注释,from mysite import views,url(r'^hello/', views.hello, name='hello'),亲测可用

吴某人 03-30 13:02

现在用的django里面,URL的写法要在()前加上url,不然会提示错误。

匿名读者 05-12 04:44

最新的django 1.9.6版本,似乎要这样才行 from django.conf.urls import url from mysite.views import hello urlpatterns = [ url(r'^hello/', hello, name='hello'), ] 按照文件注释的说明来的

罗哥 08-21 10:55

最新的django 1.10版本+py2.7下面可以实现 from django.conf.urls import * from mysite.views import hello urlpatterns = [ url(r'^hello/', hello, name='hello'), ]

lvze 09-19 09:18

在新的Django中应该是from django.conf.urls import *

shawn-huang 11-12 07:05

If your django is 1.8.16 or higher, you should change this line:"from django.conf.urls.defaults import *" into "from django.conf.urls import *". Then notice the url:"http://127.0.0.1:8000/hello/", do not miss the "/" in the end.

cw 12-16 07:58

python3.4,django 1.7.1 from mysite.mysite.views import hello才能识别hello模块,输入http://localhost:8080/hello/报错404

匿名读者 01-18 14:56

P27+D1.10,import view urlpatterns = [ url(r'^admin/', admin.site.urls),url(r'^hello/$',view.hello) ],地址别忘+hello/,完美显示。

kenny 03-24 10:18

django 1.10版本,需要改成如下: from django.conf.urls import * from views import hello urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^hello/', hello), ]

Sean 04-21 04:00

P27.13+D1.11,之前一直都是“patterns”“default”等等未定义,根据楼上的建议再导入admin,完美实现,亲测可用 from django.conf.urls import * from views import hello from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^hello/', hello), ]

Sean 04-21 04:05

还有就是,views.py我把它放到了和urls.py同一级目录里,不知道为什么mysite文件夹里又有一个mysite文件夹,而且manage.py和settings.py不在同一目录

Li peiri 06-15 01:12

2017年版本可能不一样,我按照此教程一直提示没有patterns这个model,之后修改如下:from django.conf.urls import include, url from mysite.views import hello urlpatterns = [ url(r'^hello/$', hello), ]就好用了~

匿名读者 08-26 01:01

注意django版本,10之后不支持这样写了 from mysite import views as hello urlpatterns = patterns('', ('^hello', hello.helloworld, name='helloworld'), )

yang 01-17 05:17

2.0.1版的django的urls 用的是path('^hello/$',mysite.views.hello),这样是有问题的,404.需要改成url('^hello/$',mysite.views.hello),

rabbit 05-16 06:34

Srive 07-05 01:48

from django.conf.urls import url from . import view urlpatterns = [ url(r'^$', view.hello), ]

匿名读者 04-18 01:34

django2.2 + python3.6环境 from django.contrib import admin from django.conf.urls import url from django.urls import path from mysite.views import hello urlpatterns = [ path('admin/', admin.site.urls), url('^hello/$', hello), ] 可以运行

xxky 05-27 03:47

高版本django不需要匹配正则。

icodes 11-08 13:02

高版本django不需要匹配正则 from django.urls import path from mysite.views import hello urlpatterns = [ path('hello/', hello), ]

安铺靓仔 12-04 07:20

上条评论说得对,加上之后,再次运行django,然后在链接后面加上”hello“就可以看到信息了

对这一段的评论会显示在这里

请留意:为了简洁,我们移除了注释代码。 如果你喜欢的话,你可以保留那些行。)

偶尔胤D 05-13 01:53

最后多了个括号

phpyrb 10-27 14:28

谢谢站主的无私的奉献,这些文章对我的帮忙很大,我看着你的这个,我自己也做笔记,放在 www.phpyrb.com 里。

对这一段的评论会显示在这里

我们做了两处修改。

对这一段的评论会显示在这里
  • 首先,我们从模块 (在 Python 的 import 语法中, mysite/views.py 转译为 mysite.views ) 中引入了 hello 视图。 (这假设mysite/views.py在你的Python搜索路径上。关于搜索路径的解释,请参照下文。)
  • 接下来,我们为urlpatterns加上一行: (‘^hello/$’, hello), 这行被称作URLpattern,它是一个Python的元组。元组中第一个元素是模式匹配字符串(正则表达式);第二个元素是那个模式将使用的视图函数。
IIssNan 10-25 06:04

"我们从模块 (在 Python 的 import 语法中, mysite/views.py 转译为 mysite.views ) 中引入了 current_datetime 视图。" --> 我们从模块 views(在 Python 的 import 语法中, mysite/views.py 转译为 mysite.views ) 中引入了 hello 视图。

姓名 07-31 12:21

mysite.views应该改成view,否则会有错误(python2.7版本)

豆芽 07-31 12:23

mysite.views应该改成view,否则会有错误(python2.7 django 1.4.1)

aska 11-26 08:23

楼上2位,用mysite.views没有错,只要视图文件为views.py就没关系

Yyoung 01-15 06:03

在这个URLpattern元组中,第一个元素和第二个元素的名称一定要相同吗?

Flyme 02-09 13:59

ls 这个元组中的两个元素可以不相同 这两个元素起着不同的作用 第一个 是url地址 是你要输入浏览器中的 第二个是视图函数中的 函数名称 之所以把他们两个写在一个元组中 是为了使url地址与视图函数一一对应 url地址可以随意命名 视图函数的名称也是随意的 所以这两个元素名称可同 可不同 ls仔细看书的话 这一点不难理解

匿名读者 06-04 17:31

上面是view下面又是views ,一堆坑 太烂了这教程

对这一段的评论会显示在这里

简单来说,我们只是告诉 Django,所有指向 URL /hello/ 的请求都应由 hello 这个视图函数来处理。

IIssNan 10-25 06:06

"所有指向 URL /time/ 的请求都应由 current_datetime 这个视图函数来处理。"--> 所有指向 URL /hello/ 的请求都应由 hello 这个视图函数来处理。

qing 06-26 11:28

不错,很强大

ouchz 09-18 08:20

Mark 一下

wan 02-19 02:29

一语惊醒梦中人

对这一段的评论会显示在这里

Python 搜索路径

对这一段的评论会显示在这里

Python 搜索路径 就是使用 import 语句时,Python 所查找的系统目录清单。

对这一段的评论会显示在这里

举例来说,假定你将 Python 路径设置为 ['','/usr/lib/python2.4/site-packages','/home/username/djcode/'] 。如果执行代码 from foo import bar ,Python 将会首先在当前目录查找 foo.py 模块( Python 路径第一项的空字符串表示当前目录)。 如果文件不存在,Python将查找 /usr/lib/python2.4/site-packages/foo.py 文件。

对这一段的评论会显示在这里

如果你想看Python搜索路径的值,运行Python交互解释器,然后输入:

读解dj 11-21 05:40

如何运行交互式解释器,在哪里

Hotcocoa 08-30 12:13

点菜单->运行->python

李根 05-06 02:22

为何我的出现错误

maojm 03-26 12:12

添加Python路径sys.path.append(r'C:\example\')

jcm 02-23 11:08

这里对于现在(201602)而言,应该是: print(sys.path) 或者 sys.path

对这一段的评论会显示在这里
>>> import sys
>>> print sys.path
对这一段的评论会显示在这里

通常,你不必关心 Python 搜索路径的设置。 Python 和 Django 会在后台自动帮你处理好。

对这一段的评论会显示在这里

讨论一下URLpattern的语法是值得的,因为它不是显而易见的。 虽然我们想匹配地址/hello/,但是模式看上去与这有点差别。 这就是为什么:

tango 10-02 14:02

建议译为:这里有必要讨论一下URLpattern的语法。

匿名读者 06-04 17:32

跟机器翻的一个德行。。。看不下去了

对这一段的评论会显示在这里

Django在检查URL模式前,移除每一个申请的URL开头的斜杠(/)。 这意味着我们为/hello/写URL模式不用包含斜杠(/)。(刚开始,这样可能看起来不直观,但这样的要求简化了许多工作,如URL模式内嵌,我们将在第八章谈及。)

对这一段的评论会显示在这里

模式包含了一个尖号(^)和一个美元符号($)。这些都是正则表达式符号,并且有特定的含义: 上箭头要求表达式对字符串的头部进行匹配,美元符号则要求表达式对字符串的尾部进行匹配。

stranger 05-30 17:45

正则的引入让 URL pattern 很强大,但是也难写... 不由得让人想起 mod_rewrite ...

sandas 02-03 07:55

搜索路径怎么添加

对这一段的评论会显示在这里

最好还是用范例来说明一下这个概念。 如果我们用尾部不是$的模式’^hello/’,那么任何以/hello/开头的URL将会匹配,例如:/hello/foo 和/hello/bar,而不仅仅是/hello/。类似地,如果我们忽略了尖号(^),即’hello/$’,那么任何以hello/结尾的URL将会匹配,例如:/foo/bar/hello/。如果我们简单使用hello/,即没有^开头和$结尾,那么任何包含hello/的URL将会匹配,如:/foo/hello/bar。因此,我们使用这两个符号以确保只有/hello/匹配,不多也不少。

eetube 02-26 11:37

受用,学习了

dcj 05-24 00:27

我只是来看看 评论需不需要登录

lucy 06-29 08:05

这里有个疑问,我的理解是'^hello/'并不会匹配形如'/hello/foo'的范式.如果要匹配的话,如果要匹配,是不是需要写成是'^hello/*'?

nwahlk 07-24 02:53

经过试验,该块关于开头和结尾的描述是正确的

soilblack 11-14 05:58

为什么会匹配后面的反斜杠。比如 '^hello/$'会比配 '/hello'

jason 03-11 08:27

就是说,这种匹配保证了唯一性?如果不是唯一的,怎么索引到对应的页面呢?会报错?还是只显示顶级目录?

对这一段的评论会显示在这里

你大多数的URL模式会以^开始、以$结束,但是拥有复杂匹配的灵活性会更好。

对这一段的评论会显示在这里

你可能会问:如果有人申请访问/hello(尾部没有斜杠/)会怎样。 因为我们的URL模式要求尾部有一个斜杠(/),那个申请URL将不匹配。 然而,默认地,任何不匹配或尾部没有斜杠(/)的申请URL,将被重定向至尾部包含斜杠的相同字眼的URL。 (这是受配置文件setting中APPEND_SLASH项控制的,参见附件D。)

soilblack 11-14 06:16

我所用的django版本是(1, 5, 4, 'final', 0),在默认生成的setting.py文件中,没有APPEND_SLASH项。 不过APPEND_SLASH = False项可以生效。

morphling 10-30 07:56

这个在global_settings.py里面有 global_settings.py在 C:\Python27\Lib...\django\conf\目录下面

何文敏 12-01 08:16

linux底下,全局setting文件: /usr/local/lib/python2.7/site-packages/Django-1.7.1-py2.7.egg/django/conf/global_settings.py

zhaoyu 12-29 04:06

谢谢大家的注视

zhou 05-11 03:47

使用的是django 1.1.3,windowsXp,globla_settings.APPEND_SLASH = False, URLconf ("^hello/$",hello),访问的是 xxx/hello, 为甚么也成自动匹配匹配上?(不是globla_settings.APPEND_SLASH = False不能匹配了么)

TomatoFish 03-12 18:34

Python3,Django1.8: settings.py文件中没有 APPEND_SLASH 这一项,但是添加 APPEND_SLASH = False 后,访问 URL/hello 最后没有斜杠,会找不到网页,也就是说 APPEND_SLASH 项生效

Junshan 12-16 12:59

win10里面,conda环境,在**/envs/condaName/Lib\site-packages\django\conf\global_settings.py中,可以看到APPEND_SLASH=True

对这一段的评论会显示在这里

如果你是喜欢所有URL都以’/’结尾的人(Django开发者的偏爱),那么你只需要在每个URL后添加斜杠,并且设置”APPEND_SLASH”为”True”. 如果不喜欢URL以斜杠结尾或者根据每个URL来决定,那么需要设置”APPEND_SLASH”为”False”,并且根据你自己的意愿来添加结尾斜杠/在URL模式后.

qin 09-20 14:51

django1.2.3,在我的mysite目录下 settings.py没有 APPEND_SLASH呢? 但我在settings.py末尾添加APPEND_SLASH='False',在URL结尾依然会自动添加上“/”。求解。谢谢

irockman 01-06 01:51

django1.2.4,mysite目录下 settings.py没有 APPEND_SLASH,在settings.py末尾添加APPEND_SLASH=False,在URL结尾不会自动添加上"/"。设置为True,会自动加上"/"

庞铮 04-20 06:46

遇到和评注一样的问题

budongzhenren 09-29 02:11

看下django1.4.1对他的解释,我就不翻译了。 地址:https://docs.djangoproject.com/en/dev/ref/settings/ APPEND_SLASH Default: True When set to True, if the request URL does not match any of the patterns in the URLconf and it doesn't end in a slash, an HTTP redirect is issued to the same URL with a slash appended. Note that the redirect may cause any data submitted in a POST request to be lost. The APPEND_SLASH setting is only used if CommonMiddleware is installed (see Middleware). See also PREPEND_WWW.

笑歌 05-22 08:40

2楼的是正确的

linxi 08-01 09:25

二楼正解 ( python 2.7 ; Django 1.5)

JiangJie 04-12 03:46

在settings.py的最后加入APPEND_SLASH=‘False'(带带引号)或者APPEND = False(带空格),hello后面依然会自动添加上/,而加入APPEND_SLASH=False(紧贴),hello后面不会带上/,输入http://127.0.0.1:8000/hello,显示Page not found. 这是Python语法问题?

JiangJie 04-12 03:47

在settings.py的最后加入APPEND_SLASH=‘False'(带单引号)或者APPEND = False(带空格),hello后面依然会自动添加上/,而加入APPEND_SLASH=False(紧贴),hello后面不会带上/,输入http://127.0.0.1:8000/hello,显示Page not found. 这是Python语法问题?

nilin214 08-06 11:54

ls,设置APPEND_SLASH = 'False',这种格式是字符串的形式,字符串非空即为True。至于第二种方式格式错误,使用默认值依然为True。

匿名读者 10-10 04:31

关于APPEND_SLASH,推荐一篇博客的解说 https://www.cnblogs.com/zhuchunyu/p/11062044.html

对这一段的评论会显示在这里

另外需要注意的是,我们把hello视图函数作为一个对象传递,而不是调用它。 这是 Python (及其它动态语言的) 的一个重要特性: 函数是一级对象(first-class objects), 也就是说你可以像传递其它变量一样传递它们。 很酷吧?

对这一段的评论会显示在这里

启动Django开发服务器来测试修改好的 URLconf, 运行命令行 python manage.py runserver 。 (如果你让它一直运行也可以,开发服务器会自动监测代码改动并自动重新载入,所以不需要手工重启) 开发服务器的地址是 http://127.0.0.1:8000/ ,打开你的浏览器访问 http://127.0.0.1:8000/hello/ 。 你就可以看到输出结果了。 开发服务器将自动检测Python代码的更改来做必要的重新加载, 所以你不需要重启Server在代码更改之后。服务器运行地址[http://127.0.0.1:8000](http://127.0.0.1:8000)/ ,所以打开浏览器直接输入[http://127.0.0.1:8000/hello](http://127.0.0.1:8000/hello)/ ,你将看到由你的Django视图输出的Hello world。

liqin 12-17 14:38

所以在修改代码之后不需要重启server。

xchannel 03-12 18:59

下面那块讲正则的表格,‘零个或一个之前的表达式(例如:\d? 匹配零个或一个数字)’这句前面的应该是‘?’不是‘*’

wwww 12-24 07:52

ljdslfdsfdsfsd

georgehuang 06-11 08:52

如何一直开着服务,然后一直又能写程序?而不用写完一个,再开服务来调试,这样麻烦

Kuner 09-06 16:08

服务器运行地址`` http://127.0.0.1:8000/`` ,所以打开浏览器直接输入`` http://127.0.0.1:8000/hello/`` ,你将看到由你的Django视图输出的Hello world。--> 服务器运行地址“ http://127.0.0.1:8000/” ,所以打开浏览器直接输入“ http://127.0.0.1:8000/hello/”,你将看到由你的Django视图输出的Hello world。

读解dj 11-21 03:50

都是按照作者说的做的呀,为嘛看不到hello world,仍然处于Django的欢迎页面上

Number 02-01 15:48

完全按他的输入,http://127.0.0.1:8000/ 会有404错误,但是http://127.0.0.1:8000/hello 正常显示

yuriman 03-10 06:50

runserver --noreload可以不自动重载

python-xiyuan 05-10 17:14

终于成功hello world ,

Hotcocoa 08-30 12:22

成功

不能出现HELLO WORLD 05-20 15:46

不能出现HELLO WORLD 的原因之一,或许你是用pycharm 建立的Django 项目,你没把url(r'^admin/doc/', include('django.contrib.admindocs.urls')), 和url(r'^admin/', include(admin.site.urls))注释掉,所以会一直在欢迎界面,不能找到view,得到一个错误:Put 'django.contrib.admin' in your INSTALLED_APPS setting in order to use the admin application.

oldcai 08-07 09:35

开发服务器的地址是 http://127.0.0.1:8000/ ,打开你的浏览器访问 http://127.0.0.1:8000/hello/ 。 你就可以看到输出结果了。 开发服务器将自动检测Python代码的更改来做必要的重新加载, 所以你不需要重启Server在代码更改之后。服务器运行地址`` http://127.0.0.1:8000/`` ,所以打开浏览器直接输入`` http://127.0.0.1:8000/hello/`` ,你将看到由你的Django视图输出的Hello world。 这两句话不是翻译重复了吧,好像是说的一个意思。

匿名读者 12-06 15:10

闹了半天是端口占用,后台没关进程,kill掉就好了,按Ctrl+C开始还退不掉,后来发现和Guake的快捷键冲突了,改了就没事了,惭愧惭愧

Seventeen 03-21 12:25

出现错误SyntaxError: Non-ASCII ……然后去掉自己的中文注释……就对了

匿名读者 06-14 12:38

Django1.6中,视图函数已经推荐为视图类了!

qiaoqiao 01-30 02:09

当输入http://127.0.0.1:8000/不会显示hello world在浏览器中,然而输入http://127.0.0.1:8000/hello/会显示。本人之前用pycharm创建的project。求大神解释说明一下原因。

花生 02-11 01:10

URLconf里写的是('^hello/$', hello),就是访问http://.../hello/,才会跳到hello视图显示hello world。其他url都没有定义,所以你是正常的。

stonycat 07-18 01:44

http://127.0.0.1:8000/hello/

rabbit 05-16 08:04

2.0.9版本中,若还要用正则表达式,则需要使用re_path函数代替url函数,此时url函数已经被淘汰了。一般使用path和re_path。

对这一段的评论会显示在这里

万岁! 你已经创建了第一个Django的web页面。

an 12-25 08:47

终于出了第一个hollo了

suniven 04-23 04:51

为什么会提示importerror呢,信息如下Exception Type: ImportError Exception Value: No module named views 明明hello函数就在view.py里啊,去掉了views的s还是不行。求解~

yokel1987 04-26 14:05

views.py 必须放到mysite/mysite目录下,否则会出错,no module named views 我也是一直找不到原因,自己无意间尝试成功的,原谅我小白。

beizi1732 03-13 07:33

嗯,views要放在/mysite/mysite/下,我开始放在/mysite/下就报错

Django1.6 04-06 08:38

import sys sys.path 第一项就是指当前目录,所以views.py放到mysite\mysite下面就行了

对这一段的评论会显示在这里

正则表达式

对这一段的评论会显示在这里

正则表达式 (或 regexes ) 是通用的文本模式匹配的方法。 Django URLconfs 允许你 使用任意的正则表达式来做强有力的URL映射,不过通常你实际上可能只需要使用很少的一 部分功能。 这里是一些基本的语法。

aiven 02-22 13:08

零个或一个之前的表达式(例如:\d? 匹配零个或一个数字) 前面是‘?’不是‘*’

釜中游鱼 10-14 02:57

零个或一个之前的表达式(例如:\d? 匹配零个或一个数字),前面应该是?号

对这一段的评论会显示在这里

有关正则表达式的更多内容,请访问 http://www.djangoproject.com/r/python/re-module/.

iComes 02-13 11:18

“函数可以作为参数传递”并不只是动态语言的特性

leonchan 02-25 11:37

这里提到的动态语言的特性是说函数是一级对象,不是你所说的函数作为参数传递,C\C++的确可以把函数作为参数传递,但那只是作为指针看待

andywu1206 09-27 08:05

"...做为一个对象传递,而不是调用它" 这句话应该怎么理解呢?

ROKR 12-22 16:01

同问怎样理解对象传递和调用

July 02-20 08:34

func(hello)这是传递 hello()这是调用

RobinChan 10-11 01:08

C++里面函数可以作为参数传递但是传递的是函数的指针,如果我没理解错这里的话,这里可能只是的类似变量,传递的不是函数的地址,而是函数本身的内容。

对这一段的评论会显示在这里

关于“404错误”的快速参考

对这一段的评论会显示在这里

目前,我们的URLconf只定义了一个单独的URL模式: 处理URL /hello/ 。 当请求其他URL会怎么样呢?

IIssNan 10-25 06:13

"/time/"--> /hello/

izhend 08-30 03:24

在刚才配置了url.py之后,为什么访问http://127.0.0.1:8000/也不可以了,之前没有配置的时候不是可以的吗?这是什么原因?默认配置被改了吗?

吴扬 09-13 06:31

为什么我的页面一直都是欢迎页面 连404都不报 不管输入什么地址 崩溃

笑歌 05-22 09:18

回复2楼,如果在没写hello之前的话,默认就是Django的欢迎界面,好像是

独进青楼 11-28 05:37

鼠标选中时会显示不全,我是用的是谷歌浏览器

对这一段的评论会显示在这里

让我们试试看,运行Django开发服务器并访问类似 http://127.0.0.1:8000/goodbye/ 或者 http://127.0.0.1:8000/hello/subdirectory/ ,甚至 http://127.0.0.1:8000/ (网站根目录)。 你将会看到一个 “Page not found” 页面(图 3-2)。 因为你的URL申请在URLconf中没有定义,所以Django显示这条信息。

Tian Siyuan 03-21 13:06

见图3-2,应为3-1

Tian Siyuan 03-21 13:06

图3-2,应为3-1

lincy 08-11 10:58

图挂了

匿名读者 10-02 15:13

http://www.djangobook.com/en/2.0/_images/404.png

ck 09-11 03:16

图无法访问不知道是否能够修复下

urmyfaith 09-13 04:47

图片已经提交过了的... http://www.djangobook.com/en/2.0/_images/404.png

匿名读者 12-19 11:30

我在上面想了半天为什么登陆原来的url会404,看到这里才知道是正常的,

对这一段的评论会显示在这里

图3-1: Django的404 Error页

对这一段的评论会显示在这里

这个页面比原始的404错误信息更加实用。 它同时精确的告诉你Django调用哪个URLconf及其包含的每个模式。 这样,你应该能了解到为什么这个请求会抛出404错误。

对这一段的评论会显示在这里

当然,这些敏感的信息应该只呈现给你-开发者。 如果是部署到了因特网上的站点就不应该暴露 这些信息。 出于这个考虑,这个“Page not found”页面只会在 调试模式(debug mode) 下 显示。 我们将在以后说明怎么关闭调试模式。

对这一段的评论会显示在这里

关于网站根目录的快速参考。

山人 03-06 10:59

标记

对这一段的评论会显示在这里

在最后一节,如果你想通过http://127.0.0.1:8000/看网站根目录你将看到一个404错误消息。Django不会增加任何东西在网站根目录,在任何情况下这个URL都不是特殊的 就像在URLconf中的其他条目一样,它也依赖于指定给它的URL模式.

吕婉琪 11-26 07:44

应该是“上一节”而不是“最后一节”,估计是翻译问题,将last翻译成最后了

对这一段的评论会显示在这里

尽管匹配网站根目录的URL模式不能想象,但是还是值得提一下的. 当为网站根目录实现一个视图,你需要使用URL模式‘^$’ , 它代表一个空字符串。 例如:

姚汝颢 05-22 01:47

不能想象应改为不难想象

杨明 11-13 07:16

当想为网站根目录实现一个视图

ccne 12-30 10:35

Unresolved import: my_homepage_view

xlaok 07-10 16:44

说实话,这书翻译的真不是一般的烂

soda 07-26 06:39

my_homepage_view 是需要在views页面定义的一个对象,类似于hello

JiangJie 04-12 03:54

3l, 这里你应该像新增一个hello视图一样, 在views.py里添加一个my_homepage_view的视图。

tips 05-22 05:40

说一下修改的地方,比如默认用index方法,urls.py///from books.views import index//url(r'^$', index),////views.py///def index(request): return HttpResponse("Hello World-index")

winnie 01-23 09:14

urlpatterns = patterns('', ('^hello/$', hello), ('^$', my_homepage_view), )

rabbit 05-16 08:15

2.0.9版本中,首页不能再写成'^$',应该直接''。

对这一段的评论会显示在这里
from mysite.views import hello, my_homepage_view

urlpatterns = patterns('',
    ('^$', my_homepage_view),
    # ...
)
对这一段的评论会显示在这里

Django是怎么处理请求的

对这一段的评论会显示在这里

在继续我们的第二个视图功能之前,让我们暂停一下去了解更多一些有关Django是怎么工作的知识. 具体地说,当你通过在浏览器里敲http://127.0.0.1:8000/hello/来访问Hello world消息得时候,Django在后台有些什么动作呢?

匿名读者 09-12 06:33

ew

三千周 04-26 07:27

django的响应处理,由内部的中间件机制完成,setting中注册了此机制

对这一段的评论会显示在这里

所有均开始于setting文件。当你运行python manage.py runserver,脚本将在于manage.py同一个目录下查找名为setting.py的文件。这个文件包含了所有有关这个Django项目的配置信息,均大写: TEMPLATE_DIRS , DATABASE_NAME , 等. 最重要的设置时ROOT_URLCONF,它将作为URLconf告诉Django在这个站点中那些Python的模块将被用到

liqin 12-17 15:30

最重要到设置是ROOT_URLCONF

liqin 12-17 15:31

最重要的设置是ROOT_URLCONF - - 输入法出错鸟

David 02-24 08:18

....那些Python的模块将被用到 ->应该是"哪些"

blkworm 04-15 02:54

本段第一行“脚本将在于manage.py”的“于”应当是“与”

Ol 08-24 11:47

哈哈,看得都好仔细啊

董伟 02-21 14:07

那些-->哪些

ode2free 04-06 10:14

setting 文件 --> settings 文件

charlesgu 09-27 05:58

脚本将在于manage.py同一个目录下查找名为setting.py的文件。改译为:脚本将在与manage.py相同的目录中查找名为setting.py的文件。

Rex.Ye 01-08 04:50

Python 2.7.3,Django verison 1.4.3中manage.py和settings.py不在同一个目录下,目录结构如下: mysite\ manage.py mysite\ _init_.py settings.py urls.py wsgi.py

Rex.Ye 01-08 04:52

Python 2.7.3,Django verison 1.4.3中manage.py和settings.py不在同一个目录下,目录结构如下: mysite\ ┗manage.py ┗mysite\ ┗_init_.py ┗settings.py ┗urls.py ┗wsgi.py

王龙 12-12 03:36

"最重要的设置时", "时"应该是"是"

匿名读者 10-27 06:14

大家看的真的好认真

reader 10-22 09:16

"最重要的评注时" 应修改为 "最重要的评注是"

1 03-02 10:16

1

1</a><script>alert("1");</script> 03-02 10:17

1

1 03-02 10:18

1</p><script>alert("1");</script><p>1

mengxun 10-10 04:25

‘所有均开始于’不太通顺,翻译成 当runserver时setting文件是第一个被执行的 比较恰当

对这一段的评论会显示在这里

还记得什么时候django-admin.py startproject创建文件settings.py和urls.py吗?自动创建的settings.py包含一个ROOT_URLCONF配置用来指向自动产生的urls.py. 打开文件settings.py你将看到如下:

tic 03-21 16:01

when这里应该是“当。。。时候”的意思 应翻译为:还记得当我们运行 django-admin.py startproject 时创建的文件settings.py和urls.py吗?

zhangfeng86911 11-12 15:50

ls的评注很到位!

Zhou Wei 06-14 15:47

1楼正解

小菜 12-28 08:06

1.7.1中的settings.py位于/mysite/mysite/目录下

bikegcy 07-14 08:30

这翻译也真是...

对这一段的评论会显示在这里
ROOT_URLCONF = 'mysite.urls'
对这一段的评论会显示在这里

相对应的文件是mysite/urls.py

对这一段的评论会显示在这里

当访问 URL /hello/ 时,Django 根据 ROOT_URLCONF 的设置装载 URLconf 。 然后按顺序逐个匹配URLconf里的URLpatterns,直到找到一个匹配的。 当找到这个匹配 的URLpatterns就调用相关联的view函数,并把 HttpRequest 对象作为第一个参数。 (稍后再给出 HttpRequest 的更多信息) (我们将在后面看到HttpRequest的标准)

IIssNan 10-25 06:16

"/time/"--> /hello/

phoenix 02-13 05:00

进来的请求转入/hello/-->进来的请求传入/hello/,觉得这样更容易理解

对这一段的评论会显示在这里

正如我们在第一个视图例子里面看到的,一个视图功能必须返回一个HttpResponse。 一旦做完,Django将完成剩余的转换Python的对象到一个合适的带有HTTP头和body的Web Response,(例如,网页内容)。

zhongqi 02-06 10:16

“一旦做完”之后一句的翻译悲剧了吧……

zhentuy 02-17 07:48

Django将完成剩余的,转换Pyhton对象…… 漏一逗号!

chifa 04-22 08:24

这句的译文很拗口很难理解.

Zhou Wei 06-14 15:55

HttpResponse对象返回之后,django继续将之转换成带有Http headers和body的web响应(例如,网页内容)。

jiangguoqiang 10-27 09:47

各种大脑自动调整哈

learn 05-14 04:44

的确,这段很绕,不明所以

Xavier 07-14 08:27

这本书好有历史感

匿名读者 09-05 12:36

“Django转换HttpResponse为一个适合的HTTP response, 以Web page显示出来” 后一个response应该翻译成中文:HTTP响应

zhaoyu 12-26 06:52

谢谢翻译团队的幸苦工作

TomatoFish 03-12 19:10

Python3,Django1.8: 还好有如此强大的评注功能~!!

对这一段的评论会显示在这里

总结一下:

对这一段的评论会显示在这里
  1. 进来的请求转入/hello/.
  2. Django通过在ROOT_URLCONF配置来决定根URLconf.
  3. Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目。
  4. 如果找到匹配,将调用相应的视图函数
  5. 视图函数返回一个HttpResponse
  6. Django转换HttpResponse为一个适合的HTTP response, 以Web page显示出来
looly 01-19 17:40

图片挂了

lincy 08-11 11:02

图挂了(ps:为什么很久之前提的问题一直没有改进。。。。)

spacewalker 08-13 02:38

同楼上,图片不显示

匿名读者 10-02 15:14

http://www.djangobook.com/en/2.0/_images/404.png

fangzhou 08-05 13:17

IvanKe93 09-15 06:02

图片挂了~~

misutt 10-17 08:29

图挂了~

bill.li 11-12 09:28

现在仍然是挂的

匿名读者 02-10 07:14

fork

匿名读者 04-24 08:12

图挂了,求修复

对这一段的评论会显示在这里

你现在知道了怎么做一个 Django-powered 页面了,真的很简单,只需要写视图函数并用 URLconfs把它们和URLs对应起来。 你可能会认为用一系列正则表达式将URLs映射到函数也许会比较慢,但事实却会让你惊讶。

fool 10-23 01:28

看原文没有最后一句关于re的速度

笑歌 05-22 09:56

原文地址貌似失效了

对这一段的评论会显示在这里

第二个视图: 动态内容

对这一段的评论会显示在这里

我们的Hello world视图是用来演示基本的Django是如何工作的,但是它不是一个动态网页的例子,因为网页的内容一直是一样的. 每次去查看/hello/,你将会看到相同的内容,它类似一个静态HTML文件。

对这一段的评论会显示在这里

我们的第二个视图,将更多的放些动态的东西例如当前日期和时间显示在网页上 这将非常好,简单的下一步,因为它不引入了数据库或者任何用户的输入,仅仅是输出显示你的服务器的内部时钟. 它仅仅有限度的比Helloworld刺激一些,但是它将演示一些新的概念

helloppx 03-07 10:46

因为它不引入了数据库或者任何用户的输入 -> 因为它没引入数据库或者任何用户的输入

alexde 02-09 03:13

呀。。。刺激多了

TaoBeier 06-17 08:11

因为它没有引入.....

sdfuioy 10-31 03:12

它仅仅有限度的比Helloworld刺激一些 -> 它仅仅有限度地比Helloworld刺激一些

zyy 10-19 15:11

感谢翻译的工作,但是总感觉有些地方像是机器翻的

对这一段的评论会显示在这里

这个视图需要做两件事情: 计算当前日期和时间,并返回包含这些值的HttpResponse 如果你对python很有经验,那肯定知道在python中需要利用datetime模块去计算时间 下面演示如何去使用它:

对这一段的评论会显示在这里
>>> import datetime
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2008, 12, 13, 14, 9, 39, 2731)
>>> print now
2008-12-13 14:09:39.002731
Liang 06-25 09:20

Old Syntax: print x New syntax: print (x, end="") #appends a space instead of a newline

对这一段的评论会显示在这里

以上代码很简单,并没有涉及Django。 它仅仅是Python代码。 需要强调的是,你应该意识到哪些是纯Python代码,哪些是Django特性代码。 (见上) 因为你学习了Django,希望你能将Django的知识应用在那些不一定需要使用Django的项目上。

saber 08-27 12:45

the code here can be html=("<html> <body>It is now %s </body></html>"% now) or it can be a error result

对这一段的评论会显示在这里

为了让Django视图显示当前日期和时间,我们仅需要把语句:datetime.datetime.now()放入视图函数,然后返回一个HttpResponse对象即可。代码如下:

对这一段的评论会显示在这里
from django.http import HttpResponse
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)
对这一段的评论会显示在这里

正如我们的hello函数一样,这个函数也保存在view.py中。为了简洁,上面我们隐藏了hello函数。下面是完整的view.py文件内容:

蚁斗士 02-25 03:27

这里的view.py应改为views.py?下面好像还有这个问题

wm 08-04 07:14

应该将view.py改为views.py

ty 01-12 12:40

一会儿是views.py 一会儿是view.py

xieyj 02-02 03:34

不知为何,时间显示为昨天晚上,系统为ubuntu12.10,昨晚是挂起过。

leejaen 02-20 11:27

view和views争论很多,把这个问题理清楚了,别让读者看着这么难理解不行啊

胡昂 04-02 08:25

明显是笔误。

Simon 06-06 15:12

cannot import name current_datetime、、、、上次是不能import hello、、这次、、、、

anguszhang 07-10 05:51

只要记住和你import的名字保持一致就行了,不用计较是到底是view还是views,例如你的文件名为view,就是import <prjname>.view

脐橙君 09-22 10:45

文中的名字view.py都应该改为views.py

JiangJie 04-12 04:03

同4l,时间显示的昨天晚上...ubuntu 12.04

chaoqi 09-10 23:53

#python3.4 html = '<html><body>It is now {}.</body></html>'.format(now) 工作OK

hello 10-30 08:19

我想问一下,既然django基于MVC模式,是不是就是指view.py属于view,urls.py属于controllwe。然后哪个文件属于model呢?setting.py和manage.py?

yazhou 03-10 08:01

这里又是view.py大家注意和作者下面的views.py是一个文件

sytu 03-04 12:27

TIME_ZONE = 'Asia/Shanghai'

陈博 09-19 00:48

按照教程中这么写 def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html) 会在 html = "<html><body>It is now %s.</body></html>" % now 一行报IndentationError错误,检查了一下缩进没发现问题,把now一行改成now=1234(后来发现好像凡是带括号的就有问题),这是什么原因啊?

对这一段的评论会显示在这里
from django.http import HttpResponse
import datetime

def hello(request):
    return HttpResponse("Hello world")

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)
fingertap 04-20 15:32

事实上,%s是比较差的python风格,最好的做法是 'Today is {day}, {month}'.format(day=today_day, month=today_month)

对这一段的评论会显示在这里

(从现在开始,如非必要,本文不再重复列出先前的代码。 你应该懂得识别哪些是新代码,哪些是先前的。) (见上)

对这一段的评论会显示在这里

让我们分析一下改动后的views.py:

对这一段的评论会显示在这里

在文件顶端,我们添加了一条语句:import datetime。这样就可以计算日期了。

对这一段的评论会显示在这里

函数中的第一行代码计算当前日期和时间,并以 datetime.datetime 对象的形式保存为局部变量 now

HeroicLee 03-07 12:26

并以datetime.datetime对象的形式保存为局部变量now 这句话的意思 datetime.datetime 是一个对象吗?然后使用now来保存

对这一段的评论会显示在这里

函数的第二行代码用 Python 的格式化字符串(format-string)功能构造了一段 HTML 响应。 字符串中的%s是占位符,字符串后面的百分号表示用它后面的变量now的值来代替%s。变量%s是一个datetime.datetime对象。它虽然不是一个字符串,但是%s(格式化字符串)会把它转换成字符串,如:2008-12-13 14:09:39.002731。这将导致HTML的输出字符串为:It is now 2008-12-13 14:09:39.002731。

zhzhzoo 04-12 12:53

是%s和%运算符把datetime.datetime 对象转成了字符串还是 该对象有__str__一类方法?

MForever78 12-27 06:53

哪里错误了啊...这半句话说的好蛋疼...

keetron 01-05 12:35

我觉得应该是对象now替换%的位置,然后s又将对象now转成字符串类型

李先森 02-24 10:47

c语言的格式化字符串=。= 哪有这么麻烦

天悬 05-28 15:51

我就想问问<html><body>是什么意思?

Junyuan Hong 06-08 15:15

<html><body>都是html的标记

EvilFinder 02-22 02:35

这将导致HTML的输出字符串为-->这会使得HTML的输出字符串为

对这一段的评论会显示在这里

(目前HTML是有错误的,但我们这样做是为了保持例子的简短。)

对这一段的评论会显示在这里

最后,正如我们刚才写的hello函数一样,视图返回一个HttpResponse对象,它包含生成的响应。

对这一段的评论会显示在这里

添加上述代码之后,还要在urls.py中添加URL模式,以告诉Django由哪一个URL来处理这个视图。 用/time/之类的字眼易于理解:

对这一段的评论会显示在这里
from django.conf.urls.defaults import *
from mysite.views import hello, current_datetime

urlpatterns = patterns('',
    ('^hello/$', hello),
    ('^time/$', current_datetime),
)
ads 02-02 07:24

adf

ivy 04-16 02:03

注意引用开始current_datetime

采姑娘的小蘑菇 05-20 15:14

我的必须写成:urlpatterns = patterns('',('^hello/$', 'mysite.views.hello'),('^time/$','mysite.views.current_datetime'))才能操作成功。'mysite.views.current_datetime'表示第二个mysite文件夹下views文件中的current_datetime。

Lynn 10-04 14:22

这一个地方我不太懂,为什么不是用‘^current_datetime$’这个名字去匹配,可能是我上面没看太懂吧,谁给我解释一下?

shining 10-18 09:26

奇怪,不能import current_time.而且再次去掉这个更新后的代码又能运行了,可惜哪怕我改变了“hello world”成为别的字符串,网页显示的依然是hello world!删除浏览器记录,缓存也不行!

Andrew-Shi 12-07 07:21

应该在helloworld的这一行前加#注释掉,否则映射不上

keetron 01-05 12:39

完全没有问题

NeuSimon 01-16 15:05

一开始我也是接着原来的views.py写的,不好使,后来重新建了一个工程,里面也包含hello那块,就好使了。。。但是我代码和之前不好使的那个工程师一模一样的啊,不知道怎么回事。。。有人明白么?

tips 05-22 05:52

{#urls.py里面要有 from books.views import hello,current_datetime#要有模式匹配url(r'^hello/$', hello), url(r'^time/$', current_datetime),}{views.py里面要有对应的方法,原谅我喊他方法,我也不知道叫啥,def hello(request): return HttpResponse("Hello World") def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)

Adoo 12-18 07:52

刚开始也显示不出time的那个页面,后面删掉time的代码重新写过又可以了,不知道之前问题躲在哪里

徐子迈 05-30 02:06

django.conf.urls.defaults 已经不能导入了 替换为from django.conf.urls import url from django.contrib import admin 同时pattrerns()已经废弃 替换为urlpatterns = [ url(r'^time/plus/(\d{1,2})/$', hours_ahead) ]

匿名读者 11-24 03:25

这个到底是1.x还是2.x,2.x 都没有patterns这个函数了

123 04-29 07:52

123

对这一段的评论会显示在这里

这里,我们修改了两个地方。 首先,在顶部导入current_datetime函数; 其次,也是比较重要的:添加URL模式来映射URL中的/time/和新视图。 理解了么?

对这一段的评论会显示在这里

写好视图并且更新URLconf之后,运行命令python manage.py runserver以启动服务,在浏览器中输入http://127.0.0.1:8000/time/。 你将看到当前的日期和时间。

读解dj 11-21 06:03

如何更新URLconf

chrischan 07-19 12:37

re ls : 更新URLconf就是把('^time$',...)加到urlpatterns里

cabbageKK 05-16 15:03

不知道为什么,我这里运行之后会出现django cannot import name current_datetime错误,求解!

cabbageKK 05-16 16:27

不知道为什么,删除了之前建的mysite文件夹,又重新按步骤走了一遍。。就又好了_(:з」∠)_

jude 08-29 14:29

同ls 不明所以

one菲斯 09-24 09:36

3.0的是URL-->views.py-->**.html文件,接着更新数据库, python manage.py makemigrations **文件夹(这个文件夹是你放model.py和views.py的文件夹)接着是:python manage.py migrate,这样再重新运行Python manage.py runserver即可,这个是3.0版本的运行方式

对这一段的评论会显示在这里

Django时区

对这一段的评论会显示在这里

视乎你的机器,显示的日期与时间可能和实际的相差几个小时。 这是因为Django是有时区意识的,并且默认时区为America/Chicago。 (它必须有个值,它的默认值是Django的诞生地:美国/芝加哥)如果你处在别的时区,你需要在settings.py文件中更改这个值。请参见它里面的注释,以获得最新世界时区列表。

施洲博 11-20 05:52

视乎>>似乎

jawatang 07-20 09:27

回楼上,视乎不是“似乎”的意思。如果是‘似乎’的意思,那这句话就乱了。视乎是“要看”的意思,举例:短期表现将视乎内地股市表现,这句话经常看见。翻译大哥有炒股的可能。。 :)

JerryOne 10-12 18:18

时区可修改为Asia/Shanghai

Woods 10-22 09:41

时区可在 http://en.wikipedia.org/wiki/List_of_tz_zones_by_name 中得到

zhongqi 02-06 10:36

时区在这里有必要改吗?我看显示出来的时间跟我机器上的一样啊

zhongqi 02-06 10:41

参见这个 http://blog.yangyubo.com/2009/08/19/unreliable-django-timezone/

淡然一笑 12-10 15:33

在setting里修改时区

淡然一笑 12-10 15:33

在setting.py里修改时区

笑歌 05-22 16:18

不知道为什么,我的时间和机器上的时间是一致的

Maka 07-10 08:16

我感觉这里的America是指的美洲而不是美国!

sven 08-07 08:40

这里时间用的是python的 datetime 怎么会不一样? 应该是终端里打印的是什么就是什么啊... 怎么可能会变?

lincy 08-11 11:29

同问为何不改时间也并无误差

Jasper 09-14 06:32

python中datetime.now()返回的好像就是当前的本地时间。没改时区却得到正确的时间估计是和python有关

pandaxxk 05-01 14:04

我把settings.py里的TIME_ZONE改成‘Asia/Shanghai’会报错,到底怎么办啊?我的显示时间还和本地时间差8个小时

木叶飞飞 05-25 13:21

如果setting里是TIME_ZONE = 'UTC',显示结果就会一样的。

Junyuan Hong 06-08 15:20

我把TIME_ZONE改成‘Asia/Shanghai’就可以了

匿名读者 07-16 08:22

把UTC改成Asia/Shanghai就正常了

hukefan 07-22 07:37

“ucf”改成“ucf+8”也行

badman 06-12 13:23

先去读settings.py,挑时区,所以django和终端出来不一样

大橙猫 10-10 11:40

# Internationalization # https://docs.djangoproject.com/en/1.11/topics/i18n/ # 默认语言与时区 # LANGUAGE_CODE = 'en-us' # # TIME_ZONE = 'UTC' # # USE_I18N = True # # USE_L10N = True # # USE_TZ = True # 修改版 LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True USE_TZ = False

对这一段的评论会显示在这里

URL配置和松耦合

对这一段的评论会显示在这里

现在是好时机来指出Django和URL配置背后的哲学: 松耦合 原则。 简单的说,松耦合是一个 重要的保证互换性的软件开发方法。

木叶飞飞 05-25 13:22

这里的松耦合应该怎么理解?

天悬 05-28 15:54

高聚合,低耦合是编写每一个软件所需要遵守的原则

对这一段的评论会显示在这里

Django的URL配置就是一个很好的例子。 在Django的应用程序中,URL的定义和视图函数之间是松 耦合的,换句话说,决定URL返回哪个视图函数和实现这个视图函数是在两个不同的地方。 这使得 开发人员可以修改一块而不会影响另一块。

对这一段的评论会显示在这里

例如,考虑一下current_datetime视图。 如果我们想把它的URL 从原来的 /time/ 改变到 /currenttime/ ,我们只需要快速的修改一下URL配置即可, 不用担心这个函数的内部实现。 同样的,如果我们想要修改这个函数的内部实现也不用担心会影响 到对应的URL。

匿名读者 12-09 13:11

<script>alert("hello")</script>

对这一段的评论会显示在这里

此外,如果我们想要输出这个函数到 一些 URL, 我们只需要修改URL配置而不用 去改动视图的代码。 在这个例子里,current_datetime被两个URL使用。 这是一个故弄玄虚的例子,但这个方法迟早会用得上。

对这一段的评论会显示在这里
urlpatterns = patterns('',
    ('^hello/$', hello),
    ('^time/$', current_datetime),
    ('^another-time-page/$', current_datetime),
)
lincy 08-11 11:32

为何楼上这么多空评论?

DavidZoo 09-13 15:05

哲学 好高深啊

快乐小子 09-22 08:43

内容很不错,像和我们再谈话。呵呵

1qwrw 10-30 11:55

<script>alert(1)</script>

keetron 01-05 12:50

空楼是在炫哲学吗?

木叶飞飞 05-25 13:25

空评论啥也不用填,直接提交就行。应该算是网站的一个bug

weller 09-24 02:53

请不要在评注里提交垃圾信息,谢谢,大家都是来学习的。

test 07-20 05:45

<script>alert('测试123')</script>

Hiki 07-31 08:10

正则表达式后面要填方法的相对路径

李勇 02-29 02:32

所谓松耦合,其实只是增加无端的复杂性,而且如果url改变了,所有引用该url作为连接地址的代码不是一样都需要修改吗?

吴某人 03-30 12:20

松耦合应该是板块化设计的意思。在这个地方体现为将URLconf抽象为一个目录,而views里面的函数都是该目录下的具体内容。通过对目录的指定而调用不同的内容,内容的变化不会引起目录的变化,目录的变化不会引起内容的变化。

匿名读者 06-27 02:34

故弄玄虚翻译得好

不满 06-16 02:54

"如果我们想要输出这个函数到 一些 URL",翻译为“如果我们想夺多个URL对应一个函数”是不是更好

对这一段的评论会显示在这里

URLconf和视图是松耦合的。 我们将在本书中继续给出这一重要哲学的相关例子。

对这一段的评论会显示在这里

第三个视图 动态URL

对这一段的评论会显示在这里

在我们的current_datetime 视图范例中,尽管内容是动态的,但是URL ( /time/ )是静态的。 在 大多数动态web应用程序,URL通常都包含有相关的参数。 举个例子,一家在线书店会为每一本书提供一个URL,如:/books/243/、/books/81196/。

IIssNan 10-25 06:31

"在我们的第一个视图范例中"--> 在我们的current_datetime(第二个)视图范例中

对这一段的评论会显示在这里

让我们创建第三个视图来显示当前时间和加上时间偏差量的时间,设计是这样的: /time/plus/1/ 显示当前时间+1个小时的页面 /time/plus/2/ 显示当前时间+2个小时的页面 /time/plus/3/ 显示当前时间+3个小时的页面,以此类推。

IIssNan 10-25 06:32

"让我们创建第二个视图"--> 让我们创建第三个视图

对这一段的评论会显示在这里

新手可能会考虑写不同的视图函数来处理每个时间偏差量,URL配置看起来就象这样:

对这一段的评论会显示在这里
urlpatterns = patterns('',
    ('^time/$', current_datetime),
    ('^time/plus/1/$', one_hour_ahead),
    ('^time/plus/2/$', two_hours_ahead),
    ('^time/plus/3/$', three_hours_ahead),
    ('^time/plus/4/$', four_hours_ahead),
)
对这一段的评论会显示在这里

很明显,这样处理是不太妥当的。 不但有很多冗余的视图函数,而且整个应用也被限制了只支持 预先定义好的时间段,2小时,3小时,或者4小时。 如果哪天我们要实现 5 小时,我们就 不得不再单独创建新的视图函数和配置URL,既重复又混乱。 我们需要在这里做一点抽象,提取 一些共同的东西出来。

对这一段的评论会显示在这里

关于漂亮URL的一点建议

对这一段的评论会显示在这里

如果你有其它web平台的开发经验(如PHP或Java),你可能会想:嘿!让我们用查询字符串参数吧! 就像/time/plus?hours=3里面的小时应该在查询字符串中被参数hours指定(问号后面的是参数)。

对这一段的评论会显示在这里

可以 在Django里也这样做 (如果你真的想要这样做,我们稍后会告诉你怎么做), 但是Django的一个核心理念就是URL必须看起来漂亮。 URL /time/plus/3/ 更加清晰, 更简单,也更有可读性,可以很容易的大声念出来,因为它是纯文本,没有查询字符串那么 复杂。 漂亮的URL就像是高质量的Web应用的一个标志。

匿名读者 11-01 03:44

URL /time/plus/3/ 更加清晰, 更简单,也更有可读性,可以用到其它语言

天悬 05-28 16:04

漂亮,优雅,大道至简,不仅是Django的理念,整个python都是这样

Jack 06-16 07:50

虽然“/time/plus?hours=3”这种url不够漂亮,但是语义性更强些

Xavier 07-14 09:29

同意楼上观点

匿名读者 12-23 10:17

不同意楼上观点

psd 05-24 15:25

查询字符串的语义性更强

@_hhnj 02-09 02:38

同意 "查询字符串的语义性更强" 這個觀點

对这一段的评论会显示在这里

Django的URL配置系统可以使你很容易的设置漂亮的URL,而尽量不要考虑它的 反面

对这一段的评论会显示在这里

那么,我们如何设计程序来处理任意数量的时差? 答案是:使用通配符(wildcard URLpatterns)。正如我们之前提到过,一个URL模式就是一个正则表达式。因此,这里可以使用d+来匹配1个以上的数字。

ospad 09-10 00:08

是 \d+

rushfly 01-17 18:35

\d+

vincent 05-05 07:48

对 这里应该是\d+

bamboo 05-10 16:13

这里用的不是通配符吧,是正则表达式呀

Zombie 05-24 10:22

正则表达式+1,通配符不是这样的

对这一段的评论会显示在这里
urlpatterns = patterns('',
    # ...
    (r'^time/plus/\d+/$', hours_ahead),
    # ...
)
David 02-24 08:54

r'^time/plus/\d+/$'... 为什么要多加一个'r'呢?

0verflow 03-01 04:43

r是为了使 \ 不被当成转义字符

vincent 05-05 07:49

r"a"表示的是引号里面的a是字符,比如引号里包含特殊字符的情况,这些特殊字符不会被转义。这是PYTHON的一个用法。

发愤涂墙 08-05 01:50

为什么最后一个路由右面有','号??

cyy 03-27 02:45

d+左右少了括号,这个东东必须括起来哈

pangbin 07-12 06:20

r'^time/plus/(\d{1,2}?)/$' 如果没有取消贪婪模式,匹配不成功

zsd 10-01 13:27

貌似\d+/要改成(\d+) 不然就显示缺少一个参数

whk 03-26 03:02

r'^time/plus/(\d{1,2}?)/$' 如果没有取消贪婪模式,匹配不成功 这个贪婪模式是什么?

ivy 04-16 02:08

贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。详情见google

lincy 08-11 11:40

给楼上添个例子: 在字符串'aaaaaa'内,a{3,5} 将匹配5个‘a’字符,而a{3,5}? 只匹配3个

lincy 08-11 12:20

经测试,此处并不需要消除贪婪模式(django 1.5,python 2.7)

Mox 10-22 12:25

为什么d+两边要加 ‘\’ ‘/’这两个符号!?

Mox 10-22 12:33

额。白痴了,忽略我的问题

Sheki 11-09 12:02

试了一下 \d+必须要加(),否则会报错TypeError takes exactly 2 arguments (1 given)

Sheki 11-09 12:04

晕,我心急了,文中后面有说到

CXH 03-16 00:53

此处建议部分同学先补充一下正则表达式的知识,然后问题就都明白了

Erwa 04-20 10:19

如果是django2.0需要使用正则表达式的话需要使用re_path()函数

对这一段的评论会显示在这里

这里使用# …来表示省略了其它可能存在的URL模式定义。 (见上)

对这一段的评论会显示在这里

这个URL模式将匹配类似 /time/plus/2/ , /time/plus/25/ ,甚至 /time/plus/100000000000/ 的任何URL。 更进一步,让我们把它限制在最大允许99个小时, 这样我们就只允许一个或两个数字,正则表达式的语法就是 \d{1,2} :

walker 12-10 07:32

(r'^time/plus/\d{1,2}/$', hours_ahead), 这里配置后无法显示,查看了第一版文档的配置(r'^time/plus/(\d{1,2})/$', hours_ahead),显示正常了。这里是错了吗?

YouthLin 05-23 14:53

这样我们就只允许一个或两个数字 一位或两位数字

soga 08-16 07:38

\d{1,2},应该被()包括起来

lxy 03-13 08:43

嗯,是要用()把数字包起来才会传入视图函数中进行处理

对这一段的评论会显示在这里
(r'^time/plus/\d{1,2}/$', hours_ahead),
对这一段的评论会显示在这里

备注

对这一段的评论会显示在这里

在建造Web应用的时候,尽可能多考虑可能的数据输入是很重要的,然后决定哪些我们可以接受。 在这里我们就设置了99个小时的时间段限制。

对这一段的评论会显示在这里

另外一个重点,正则表达式字符串的开头字母“r”。 它告诉Python这是个原始字符串,不需要处理里面的反斜杠(转义字符)。 在普通Python字符串中,反斜杠用于特殊字符的转义。比如n转义成一个换行符。 当你用r把它标示为一个原始字符串后,Python不再视其中的反斜杠为转义字符。也就是说,“n”是两个字符串:“”和“n”。由于反斜杠在Python代码和正则表达式中有冲突,因此建议你在Python定义正则表达式时都使用原始字符串。 从现在开始,本文所有URL模式都用原始字符串。

迷路 01-28 08:11

这里是不是 \n 的 \ 没有显示出来?

dimens 04-09 06:43

"n" 是两个字符串:"" 和 "n",应该是指 “/n”是两个字符串 "/" 和 "n"

dimens 04-09 06:43

"n" 是两个字符串:"" 和 "n",应该是指 “/n”是两个字符串 "/" 和 "n" (上面的/为\)

phoenix 02-13 05:11

“n”是两个字符串:“”和“n”--》“\n”是两个字符串:“\”和“n”

Risk 12-11 07:08

4楼phoenix正确

Kevin 04-10 15:04

phoenix 2011-02-13 13:11:51 ^ this is right.

Lynn 10-04 14:36

按照这个意思,那么\d不也就不能转义了?就是表示\和d了?那还怎么表示数字?

Its 11-14 05:49

@Lynn 因为python代码的'\'和正则表达式有冲突,所以才有原始字符串'r'的,使用正则表达式一般都会用原始字符串'r',与django没多大的关系。

Jack 06-16 08:00

\d不是处理成普通字符的转义,而是由正则模块将其解释为数字,楼上的楼上应该去看看正则表达式的相关知识

ravenjam 02-08 02:15

'\n'是两个字符串:'\'和'n'

对这一段的评论会显示在这里

现在我们已经设计了一个带通配符的URL,我们需要一个方法把它传递到视图函数里去,这样 我们只用一个视图函数就可以处理所有的时间段了。 我们使用圆括号把参数在URL模式里标识 出来。 在这个例子中,我们想要把这些数字作为参数,用圆括号把 \d{1,2} 包围起来:

Andrew 01-15 09:37

原文用的是designated(指定),不是designed(设计)

Raindai 08-19 10:29

如果需要忽略一个括号,则只需要在(后边加?:

atlas 09-26 15:04

其实这里应该说()是拿来分组才对

c 10-11 06:18

這個括號很重要,試括號裏面的內容成為一個參數,就是下面的offset

Jack 06-16 08:03

分组是正则里的专业描述,文中的说法更加直白些

xiaomastack 08-01 06:38

(r'^time/plus/(\d{1,2})/$', hours_ahead), 貌似要用双引号才有用,我的版本是1.6.5 (r"^time/plus/(\d{1,2})/$", hours_ahead),

Neinaa 04-16 09:58

想要作为参数,在url里面用圆括号括起来!!! 看漏了这一行,囧~

匿名读者 08-14 01:11

Django2.1版本,已经改成这样的了 path('time/plus/<int:offset>/', views.hours_ahead),

diangdiang 01-31 01:27

(\d{1,2}) 这里有坑,{1, 2}里不能包含空格

安铺靓仔明 07-19 10:23

上面提到的path('time/plus/<int:offset>/', views.hours_ahead),里面的offset怎么来?答:后面会定义一个视图函数,offset就是要传进去的参数。

安铺靓仔明 07-19 12:07

还要注意到一点:<int:offset>不能有空格

对这一段的评论会显示在这里
(r'^time/plus/(\d{1,2})/$', hours_ahead),
对这一段的评论会显示在这里

如果你熟悉正则表达式,那么你应该已经了解,正则表达式也是用圆括号来从文本里 提取 数据的。

Rayzhang0101 01-27 14:02

匿名读者 09-19 08:52

hao

对这一段的评论会显示在这里

最终的URLconf包含上面两个视图,如:

esmiles 08-31 17:43

Django1.2.1中,下面的正则好像不好用了。必须指定最后正则要接收的参数名才能正常运行。 (r'^time/plus/(\d{1,2})/$', hours_ahead), ↓ (r'^time/plus/(?P<poll_id>\d{1,2})/$', hours_ahead),

JerryOne 10-12 18:30

esmiles的评注很有用,Django1.3.1中一开始也是不行,修改成 (r'^time/plus/(?P<offset>\d{1,2})/$', hours_ahead),就好了。后来发现例子中的写法也是可以的,但1和2之间不能有空格。正则表达式没怎么学过,不知是不是一个BUG。

新铸 10-26 09:30

我的是 Django 1.31, 用(r'^time/plus/(\d{1,2})/$', hours_ahead)不好使,错误是'tuple' object is not callable。 修改成(r'^time/plus/(?P<offset>\d{1,2})/$', hours_ahead)后,还是不好使啊

匿名读者 11-01 03:46

例子中的写法OK

xlaok 07-10 17:05

请问文中的r是什么意思啊?

莱恩哈特 09-02 10:20

1.4.1 这样操作出现: TypeError at /time/plus/3/ hours_ahead() takes exactly 2 arguments (1 given)

Grace 09-12 09:01

我的是 Django 1.4, 需要修改成(r'^time/plus/(?P<offset>\d{1,2})/$', hours_ahead)之后才好使。

llqbll 11-09 13:19

Django 1.4.2运行例子没问题,不用添加“?P<offset>”

aning 01-31 04:32

django1.4.3用例子源码表示无压力 :-)

StormX 03-21 11:21

我的Django是1.5.0,书例OK,不需要加?P<offset>

Zhao Hongbo 08-19 07:40

django版本(1, 5, 2, 'final', 0) 需要加?P<offset>

heicang 08-28 07:02

(?P<offset> 这个是什么意思??1.5.1不需要加这个

shellna 09-24 06:54

运行例子出现Exception Value: multiple repeat

Harry 12-22 16:32

按照例子中第一行必须要去掉.defaults 才能正常运行,第一行改为 from django.conf.urls import *

elvis 03-28 10:38

Exception Value: multiple repeat 应该是与上一个URL配置之间少打一个逗号

mihello 07-31 07:46

Django 1.6.5 测试通过,不过正则{1,2}不能有空格,这个怪哉!。

Daniels Cai 12-03 08:50

1.7 测试通过.

匿名读者 12-24 00:57

同上1.7通过

Howie 05-30 01:53

我的django1.8是这样写的 urlpatterns = [ url(r'^admin/', include(admin.site.urls)), url(r'^hello/$', "views.hello"), url(r'^time/$', "views.current_datetime"), url(r'^time/plus/(\d{1,2})/$', "views.hours_ahead"), ]

吴叔叔 05-23 14:22

在1.9.5中,不能有括号,需用 (r'^time/plus/\d{1,2}/$', views.showtime),

吴叔叔 05-23 14:36

接上,当视图函数有offset参数,需用括号匹配相应字段,否则不需

pbox 12-19 08:44

我是把url改成url(r'^timeplus/(\d{1,2})/', hours_ahead),才显示;用url(r'^time/plus/(\d{1,2})/', hours_ahead)一直显示time的html页面为什么??

xxky 05-27 09:03

re_path(r'time/plus/(\d{1,2})/$', hours_ahead)

对这一段的评论会显示在这里
from django.conf.urls.defaults import *
from mysite.views import hello, current_datetime, hours_ahead

urlpatterns = patterns('',
    (r'^hello/$', hello),
    (r'^time/$', current_datetime),
    (r'^time/plus/(\d{1,2})/$', hours_ahead),
)
修竹 11-09 12:14

Django2.2.7,已经用<>来捕捉动态URL数据了。

对这一段的评论会显示在这里

现在开始写 hours_ahead 视图。

mark 06-26 15:54

对这一段的评论会显示在这里

编码次序

lele 03-18 22:18

mark

对这一段的评论会显示在这里

这个例子中,我们先写了URLpattern ,然后是视图,但是在前面的例子中, 我们先写了视图,然后是URLpattern 。 哪一种方式比较好?

对这一段的评论会显示在这里

嗯,怎么说呢,每个开发者是不一样的。

对这一段的评论会显示在这里

如果你是喜欢从总体上来把握事物(注: 或译为“大局观”)类型的人,你应该会想在项目开始 的时候就写下所有的URL配置。

Yuri 04-24 07:42

我觉得还是先写URL好一些,就像我们写文章的大纲一样。

sombie 10-04 15:13

或译为“大菊观”……

zhoudeqiang 03-11 06:13

up 1楼。确实如此。

Clyde 06-04 06:49

说到大局观,就想起09了,哈哈

flus 09-05 01:29

++ls

yesterday 11-29 16:00

二楼正解

BirchMaple 02-08 03:24

9神威武

meng 02-26 12:40

9神威武

jack 04-06 06:52

大酒神光忙着开店赚钱了,我感觉应该是最有钱的dota解说了

dedyral 04-11 14:29

0909!

天悬 05-28 16:19

也就是先拟出一个大方向的方案,再逐步完成小细节

delphi 08-01 02:56

写代码的都打dota吗....=.=!

御坂御坂 08-28 07:55

有详细计划的话,先写配置比较好。

helloWorld 10-31 03:22

哈哈,好多Dota啊

Adoo 01-17 08:42

想不到在这个小小的角落还能碰到这么多DOTA玩家

QR 03-15 13:54

09粉丝路过。。

xxky 05-27 07:29

致敬9神

对这一段的评论会显示在这里

如果你从更像是一个自底向上的开发者,你可能更喜欢先写视图, 然后把它们挂接到URL上。 这同样是可以的。

对这一段的评论会显示在这里

最后,取决与你喜欢哪种技术,两种方法都是可以的。 (见上)

binsen 09-11 08:40

取决与→取决于

zhoudeqiang 03-11 06:13

hmm.个人觉得还是先写urls比较好一点,不容易忘记。不然回头再写,很容易打乱次序

看看你的 12-13 12:18

由顶值下与由底至上,其实本质上没什么区别

对这一段的评论会显示在这里

hours_ahead 和我们以前写的 current_datetime 很象,关键的区别在于: 它多了一个额外参数,时间差。 以下是view代码:

leyex 05-03 06:14

"In %s hour(s),..."这里应该用%d才对吧,毕竟之前把offset转换为int类型了

Tian 12-31 13:15

这会是不是更过时了

chun 11-26 09:12

python小白路过

安铺靓仔明 07-19 12:01

更pythonic 写法: html = f"<html><body>In {offset} hour(s), it will be {dt}.</body></html>"

对这一段的评论会显示在这里
from django.http import Http404, HttpResponse
import datetime

def hours_ahead(request, offset):
    try:
        offset = int(offset)
    except ValueError:
        raise Http404()
    dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
    html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt)
    return HttpResponse(html)
huangz 01-01 00:28

#urls.py,匹配修改成 (r'^time/plus/(?P<poll_id>\d{1,2})/$', hours_ahead), #views.py 修改成 def hours_ahead(request, poll_id): try: poll_id = int(poll_id) except ValueError: raise Http404("un support value") dt = datetime.datetime.now() + datetime.timedelta(hours=poll_id) html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (poll_id, dt) return HttpResponse(html)

keith 01-04 13:02

因为一个个人问题,导致我的hours_ahead经常显示没定义,要记得在urls.py中引用,from mysite.views.py import hello,hours_ahead.

Pamos 07-13 15:21

keith 2011-01-04 21:02:24 因为一个个人问题,导致我的hours_ahead经常显示没定义,要记得在urls.py中引用,from mysite.views.py import hello,hours_ahead. |直接 from mysite.views import * 可以么?

samuel 11-17 07:39

只要将"\d{1,2}"用小括号括起来就行。 即:(r'^time/plus/(\d{1,2})/$', hours_ahead),

河孢子 01-05 11:37

我说怎么显示hours_ahead未定义,原来是忘了在urls中用import引用了。

AlexCheung 09-27 08:41

offset=int(offset) 这里怎么还报错了呢!

xuaa 10-02 10:04

from testSite.views import * 使用这个语句包含,省事

Jason 02-03 13:39

(r'^time/plus/(\d{1,2})/$', hours_ahead)

xiangyang 05-03 17:15

offset=int(offset) 这里怎么还报错了呢!--->和可能是你的urls.py里的正则表达式出错了,引起offset=null导致的

采姑娘的小蘑菇 05-20 16:18

呼呼~试了好久才成功。#urls.py部分改成:(r'^time/plus/(?P<offset>\d{1,2})/$','mysite.views.hours_ahead')。即使上面用了from mysite.views import hello,hours_ahead似乎还是需要写上mysite.views后面跟上hours_ahead.

机智的读者小安安 05-30 07:40

本来报错offset=int(offset) url配置为(r'^time/plus/(\d{1,2})/$', hours_ahead)后解决

nwahlk 07-24 03:38

offset到底表示什么呢?是怎么样定义的呢。我试了下直接打印offset是"2.",是不是根据(\d{1,2})算offset啊

nwahlk 07-24 03:43

查阅上下文,终于明白了。其实就是在url那边配的一个参数。“我们想要把这些数字作为参数,用圆括号把 \d{1,2} 包围起来”

Vampire 08-08 01:59

回楼上,使用圆括号括起来就可以传递这个参数了吗

nicholas 09-24 02:50

传递多个参数,url怎么变

navii 04-26 00:49

我就是纳闷这个参数是怎么传进来的?

wwb 12-23 10:48

dt = datetime.datetime.now() + datetime.timedelta(hours=offset) 当前时间+5 ?默认是小时么 不能是分钟呀?

ljy 12-25 15:16

offset作为参数传进来,是从url访问的时候传给视图函数的。

萧萧孤客 01-28 03:52

offset参数是你在url最后边所写的数字部分,{1,2}设定你的参数是1到两位数。如:~/time/plus/1/或者/time/plus/55,如果写的是二位以上的则会返回一个404页面。在页面上显示的是In X hours,it will be 所显示的是当前时间+X后所得的日期。

王海伟 03-04 05:49

offset这个参数怎么传进来呀

吴某人 03-30 13:41

严肃的问题,这个datetimedelta()是啥,不用import吗?我这里直接denied了

对这一段的评论会显示在这里

让我们逐行分析一下代码:

对这一段的评论会显示在这里

视图函数, hours_ahead , 有 两个 参数: requestoffset . (见上)

张伯函 05-16 06:52

1.4这么搞好像不行了。。。

浮生若茶 10-04 08:44

python 2.7 环境 下划线不可用 不知道是不是我配置的问题

hyhu928 11-23 07:53

用IE8进行的测试,在urls.py当中,代码如下: url(r'^time/$',time), url(r'^time/plus/(\d{1,2})/$', hours_ahead), 注意第一行当中的$符号,要不总是显示time的信息,并且删除一下浏览器的浏览历史记录信息

特里 09-02 07:16

我怎么就没碰到你们正则表达式的问题呢?

吴某人 03-30 12:56

不得不说Python调用参数真方便。换做C不知道要加多少行。起码就要额外定义一个全局量提取URL里用户输入的参数,而这个输入的参数又需要通过一个函数转义。然后还要把srtings变成int或者unit。Python里面似乎可以通过()直接提取出正则表达式里的参数。不过还是有点疑问,参数多了怎么匹配?如果我不止一组(),或是不止一个参数呢?还是不能从C语言的思维跳出啊。顺带一提,offset是提取(r'^***/(\d{1,2}/$),***)里的参数。

匿名读者 01-25 09:22

这里为什么offset能获取url中的参数呢

对这一段的评论会显示在这里

request 是一个 HttpRequest 对象, 就像在 current_datetime 中一样. 再说一次好了: 每一个视图 总是 以一个 HttpRequest 对象作为 它的第一个参数。 (见上)

对这一段的评论会显示在这里

offset 是从匹配的URL里提取出来的。 例如:如果请求URL是/time/plus/3/,那么offset将会是3;如果请求URL是/time/plus/21/,那么offset将会是21。请注意:捕获值永远都是字符串(string)类型,而不会是整数(integer)类型,即使这个字符串全由数字构成(如:“21”)。

beansoup 11-05 13:46

offset是怎么提取出URL里的字符串的?

bon27 07-30 03:10

有同样的疑问。不过查阅上下文,得到的解答应是: "正则表达式也是用圆括号来从文本里 提取 数据的"。 因而,urls文件中的(r'^time/plus/(\d{1,2})/$', hours_ahead)语句定义了要传递的参数(\d{1,2}),传递给hours_ahead作为其第二个参数,即offset。

Jimmy 01-30 09:16

若把 (r'^time/plus/(\d{1,2})/$', hours_ahead)改成 (r'^time/plus/\d{1,2}/$', hours_ahead) 會拋出錯誤,所以是用 "()"來指定要丟給 view.py 的參數。

Jimmy 01-30 09:18

若把 (r'^time/plus/(\d{1,2})/$', hours_ahead)改成 (r'^time/plus/\d{1,2}/$', hours_ahead) 會拋出錯誤,所以是用 "()"來指定要丟給 view.py 的參數。多個參數也可以用一樣的方法指定。

wbin 02-23 11:53

Jimmy 解了我疑问

skyfisher 04-02 01:29

那是不是如果我要传递多个参数的话,从client端传递过来的还是一个字符串,只不过我可以用正则表达式从中提取出不同的内容,然后用()分别传递给试图函数的第一个,第二个参数。这样理解对吗?

ivy 04-16 02:17

这个地方处理的好神奇

sven 08-07 08:53

我也疑惑了半天 offset怎么传进来.. 读到这里感觉这个教程有点坑的味道. 传参这么重要的东西.

Lynn 10-04 14:53

嗯,传参数应该是默认的正则表达式捕获的内容作为第二个,第三个……参数,应该就是默认的,肯定有文档说明,但是这里没讲啊,估计接下来要讲的。

Andrew-Shi 12-08 01:37

应该说明怎么传参的吧,要不是看楼上各位的说明,根本理解不了啊,

kq 02-25 08:42

还是没明白到底如何捕获了这个参数

EC 03-02 11:23

这里的offset的值是由正则表达是所捕获的分组传递过来的。

匿名读者 06-10 12:25

这里要看评注了

Jack 06-16 08:12

所有对传参有疑问的人都应该去看看正则表达式的教程 http://deerchao.net/tutorials/regex/regex.htm

Yinz 12-10 03:21

这里并不是通过正则来传参的吧,关键是正则外面的那个圆括号。 例如这句:(r'^time/plus/(\d{1,2})/$', hours_ahead) 如果是标准的正则来写的话应该是: (r'^time/plus/\d{1,2}/$', hours_ahead) 相比原文少了那个圆括号,这样也的确出现了错误。所以传参是通过这里的圆括号来进行的。

沈艳朝 01-08 03:51

沈艳朝 01-08 03:52

是字符串吧

Ring 01-08 06:28

好多人没仔细看文字,本文上面设计正则表达式的时候解释了怎么传递数字了

萧萧孤客 01-28 04:00

里边说到提取参数: 我们只用一个视图函数就可以处理所有的时间段了。 我们使用圆括号把参数在URL模式里标识 出来。 在这个例子中,我们想要把这些数字作为参数,用圆括号把 \d{1,2} 包围起来: 6 (r'^time/plus/(\d{1,2})/$', hours_ahead), 如果你熟悉正则表达式,那么你应该已经了解,正则表达式也是用圆括号来从文本里 提取 数据的

QQasdhy 05-04 20:28

正则里的()定义了offset吧

YYF 10-01 04:50

感觉这里是作者故意漏掉的

02-08 08:41

正则表达式中()里的值会被提取出来,一般都是需要用其他方法来传参的,django里竟然能自动传参,我也楞了半天,应该是这个原因吧

hahaha 03-08 02:41

offset 是从匹配的URL里提取出来的

hahaha 03-08 02:42

offset 是从匹配的URL里提取出来的,捕获值永远都是字符串(string)类型,而不会是整数(integer)类型,即使这个字符串全由数字构成(如:“21”)。

vccola 06-13 11:27

开始不能理解为什么会传参,于是找到官方文档查了关于urls部分的说明,有这样一段话:"To capture a value from the URL, just put parenthesis around it." 接着看下去还有这句:"non-named regular-expression groups (via parenthesis) to capture bits of the URL and pass them as positional arguments to a view. "大概明白django可能是定义了某个函数,使得用括号括起来的部分可以作为参数按顺序传递下去 于是翻看了django的程序部分,在urls里有个resolvers.py,其中有一个函数我猜可能是我想要的一部分吧: def resolve(self,path): match = self.regex.search(path) if match: # If there are any named groups, use those as kwargs, ignoring # non-named groups. Otherwise, pass all non-named arguments as # positional arguments. kwargs = match.groupdict() args = () if kwargs else match.groups() # In both cases, pass any extra_kwargs as **kwargs. kwargs.update(self.default_args) return ResolverMatch(self.callback, args, kwargs, self.name) 因为水平有限,不能很好理解关于整个定义部分,但也似乎理解了一点,不知道对不对,望各路大神指点。

对这一段的评论会显示在这里

(从技术上来说,捕获值总是Unicode objects,而不是简单的Python字节串,但目前不需要担心这些差别。)

对这一段的评论会显示在这里

在这里我们命名变量为 offset ,你也可以任意命名它,只要符合Python 的语法。 变量名是无关紧要的,重要的是它的位置,它是这个函数的第二个 参数 (在 request 的后面)。 你还可以使用关键字来定义它,而不是用 位置。

Chika 03-17 04:44

这个地方原文的意思是它“必须”是这个函数的第二个参数(在request的后面)。你还可以使用关键字参数来代替位置参数(详情在第八章中讨论)。。中文翻译过来没有必须的意思,理解上有点乖乖的

adam_chenzh 05-18 09:34

offset怎么知道是"time/plus/(\d{1,2})"数字部分?

Jian 05-26 23:01

同LS,没明白offset是匹配到URL中传递的数字部分。

流年 05-30 15:15

正则匹配下来的 group

Cifer 05-06 08:05

如ls所说, python的正则匹配到后会返回一个group, group就是匹配到的内容, 然后把这个group的内容传递给views里定义的函数作为参数

atlas 09-26 15:28

time/plus/(\d{1,2}) 这里的()可以理解为分组

对这一段的评论会显示在这里

我们在这个函数中要做的第一件事情就是在 offset 上调用 int() . 这会把这个字符串值转换为整数。

对这一段的评论会显示在这里

请留意:如果你在一个不能转换成整数类型的值上调用int(),Python将抛出一个ValueError异常。如:int(‘foo’)。在这个例子中,如果我们遇到ValueError异常,我们将转为抛出django.http.Http404异常——正如你想象的那样:最终显示404页面(提示信息:页面不存在)。

对这一段的评论会显示在这里

机灵的读者可能会问: 我们在URL模式中用正则表达式(d{1,2})约束它,仅接受数字怎么样?这样无论如何,offset都是由数字构成的。 答案是:我们不会这么做,因为URLpattern提供的是“适度但有用”级别的输入校验。万一这个视图函数被其它方式调用,我们仍需自行检查ValueError。 实践证明,在实现视图函数时,不臆测参数值的做法是比较好的。 松散耦合,还记得么?

Chika 03-17 05:23

机灵的读者可能会问:既然我们在URLpattern里使用了正则表达式(\d{1,2})来匹配数字,那么无论如何,offset都是由数字构成的,那又怎么会碰到ValueError异常呢? 我们当然不会碰到这个异常,因为URLpattern提供了适度但有用的输入校验,但我们仍需自行检查ValueError,以防这个视图函数以其它方式被调用。在实现视图函数时,不是臆测参数值的做法是比较好的。松散耦合,还记得么?

ode2free 04-07 09:01

comments 的翻译比较好

zxwind 04-13 12:44

第一个comment的翻译应该是原意,页面上的翻译会造成误解

tonylifei 06-27 14:25

comments 中Chika 的翻译更准确,原始翻译有歧义。

zlleah 12-18 02:06

由上文可知:捕获值永远都是字符串(string)类型,而不会是整数(integer)类型,即使这个字符串全由数字构成(如:“21”)。所以offset获取的肯定是字符串不是么?int()转换后变为整数。因此, 我们当然不会碰到这个异常(ValueError异常)不是因为正则的约束,而是int()的缘故吧?

zlleah 12-18 02:08

由上文可知:捕获值永远都是字符串(string)类型,而不会是整数(integer)类型,即使这个字符串全由数字构成(如:“21”)。所以offset获取的肯定是字符串不是么?int()转换后变为整数。因此, 我们当然不会碰到这个异常(ValueError异常)不是因为正则的约束,而是int()的缘故吧?或者译文是指正则获取的肯定是整数字符串,所以int()转换后肯定也是整数而不会遇到ValueError异常?

zlleah 12-18 02:11

由上文可知:捕获值永远都是字符串(string)类型,而不会是整数(integer)类型,即使这个字符串全由数字构成(如:“21”)。所以offset获取的肯定是字符串不是么?int()转换后变为整数。因此, 我们当然不会碰到这个异常(ValueError异常)不是因为正则的约束,而是int()的缘故吧?或者译文是指正则获取的肯定是整数字符串,所以int()转换后肯定也是整数而不会遇到ValueError异常?另外,对于译文说的“但我们仍需自行检查ValueError,以防这个视图函数以其它方式被调用”能举个例子吗?

hack21 01-23 03:36

不理解楼上的意思,但是1楼的翻译很不错。

fresher 02-05 01:52

但我们仍需自行检查ValueError,以防这个视图函数以其它方式被调用。在实现视图函数时,不是臆测参数值的做法是比较好的。松散耦合,还记得么? 我也想知道“以防这个视图函数以其它方式被调用”,这个其它方式,能举个例吗

lincy 08-11 12:02

感谢一楼

spacewalker 08-13 08:15

“以防这个视图函数以其它方式被调用”:我的理解是,比如在url.py里面的代码是"(r'^time/plus/([a-z])/$', hours_ahead),"这样视图hours_ahead“以其它方式被调用”。从语法及调用上讲,在url.py中并没有任何问题,从而也体现出了“松耦合”。 下面是我基于Chika的翻译的小修改版,感谢Chika翻译的已经很好了。 机灵的读者可能会问:既然我们在URLpattern里使用了正则表达式(\d{1,2})来匹配数字,那么无论如何,offset都是由数字构成的,那又怎么会碰到ValueError异常呢? 我们当然不会碰到这个异常,因为URLpattern提供了适度但有用的输入校验,(\d{1,2})保证了offset肯定为数字。但调用hours_ahead的正则表达式可写成任何内容,本身可以不进行数字匹配,我们仍需自行检查ValueError,以防这个视图函数以其它方式被调用。在实现视图函数时,不是臆测参数值的做法是比较好的。松散耦合,还记得么?

xudshen 11-29 07:52

感谢评论

MatheMatrix 12-04 13:55

感谢一楼。

shanks 03-12 08:20

1L翻译的很好,顿悟,thanks

1楼的翻译很好 06-05 09:31

1楼的翻译很好

Radon 08-27 09:37

1楼翻的漂亮

morphling 10-30 08:54

1L好!

Nigel 11-04 16:05

难怪看不懂,直到看了一楼的翻译

ryan 12-26 08:41

一楼翻译的客观公正,不错~

chuiwen 01-25 01:50

赞1楼

gepoe 03-29 06:21

赞一楼

chj 07-13 05:58

同赞一楼

sytu 03-04 13:38

赞美1L

Ink 06-06 11:21

感谢一楼

yugan 06-04 02:59

1楼赞!

对这一段的评论会显示在这里

下一行,计算当前日期/时间,然后加上适当的小时数。 在current_datetime视图中,我们已经见过datetime.datetime.now()。这里新的概念是执行日期/时间的算术操作。我们需要创建一个datetime.timedelta对象和增加一个datetime.datetime对象。 结果保存在变量dt中。

对这一段的评论会显示在这里

这一行还说明了,我们为什么在offset上调用int()——datetime.timedelta函数要求hours参数必须为整数类型。

匿名读者 03-29 10:07

测试了下,直接用offset也行啊,为嘛要用 hours = offset

Toiphive 03-30 17:37

用hours = offset是应该为了指定hours(小时)这个参数。因为timedelta的参数如果是(hours=0,mins=0,...)之类的hours是第一个参数时可能没错,但是如果hours前有别的什么的参数时,比如(years=0,hours=0,...),导致hours不是第一个参数的时候,不指定参数名会导致bug,该计算小时的时候计算成了年什么的。

sytu 03-04 13:42

关键实参hours 指定为同名的形参hours赋值. 否则会把实参赋给years

文艺小清新 10-23 08:32

这里使用的是关键字参数,忽略位置参数的影响

对这一段的评论会显示在这里

这行和前面的那行的的一个微小差别就是,它使用带有两个值的Python的格式化字符串功能, 而不仅仅是一个值。 因此,在字符串中有两个 %s 符号和一个以进行插入的值的元组: (offset, dt)

binsen 09-11 09:43

“这行和前面的那行的的”多了1个“的”

psd 05-24 15:32

讲得好戏(|||--)

对这一段的评论会显示在这里

最终,返回一个HTML的HttpResponse。 如今,这种方式已经过时了。

wyattwang 12-27 04:03

最基本的原来呀,不会过时的吧?

kuber 12-31 07:16

"old-hat" 有两个意思, 一个是out of fashion, 过时了. 还有一个是指something has been brought up many times, 已经说过很多次了. 这里应该是后者

冯小龙 04-28 10:08

这边我假如舒服的网址是/time/plus/32,那么这个32的值是如何传到我的函数里面的呢?

andersc 06-24 09:21

同意kuber所说的。

jason 12-10 14:38

怎么会过时?没懂

Risk 12-12 03:15

不是过时,可以理解为‘这种方式我们已经很熟悉(多次提及)了’

nksfreedom 12-16 02:23

zhangli 03-27 09:24

非常感谢你们,虽然翻译还有很多问题

chifa 04-22 11:09

原来是‘已经说了好多遍’的意思啊。

guitarpl 06-15 05:53

原來如此...我想說學了半天結果說過時了

byrain 07-17 07:22

评论很欢乐 刚看到这里说过时了 还好难过 哈哈哈

lincy 08-11 12:04

二楼翻译正解,感谢

tyroger 10-12 16:42

被这过时吓到了,还好有注解

李航 01-06 07:07

感谢评论

learn 05-14 05:28

为什么输入负数也报404异常?难道\d是正整数?

匿名读者 06-09 02:59

吓哭了,才学就过时了

Wind 07-04 13:17

看评论也好欢乐的说, 有助于学习哈 ;)

pdcxs 07-11 00:03

如果希望负数的话,需要有-号匹配。这样写:-?\d+

sleeplesscell 09-16 14:51

到现在,这已经是个老套路了。

misutt 10-17 13:39

评论好欢乐的说~~~哈哈

Yinz 12-10 03:26

这原文翻译也是醉了,感谢kuber的翻译XD

大磊 12-18 07:35

翻译咋还没改

HB 03-18 06:01

吓死我了,认真看了好久了,突然来一句‘已经过时了’

HB 03-18 06:03

使用正则的变量直接被丢入offset是吗...

lipond@126.com 03-20 10:05

是的,正则表达式的值直接当参数传递,好高端!

soledad 04-10 02:05

谢谢评论,中文网站这样的贡献实在难能可贵

jcm 02-23 13:48

其实个人觉得,说是过时也不算错,因为现在对于字符串格式化,从python3x开始就有新的作为字符串格式化方法format了,这是我的笔记: 字符串格式化方法 定义语法: {fieldname[conversionflag:formatspec]} fieldname是指定参数的数字或关键词,一般为数字/关键词/关键词.属性/字典.[键] conversionflag是指r/s/a,r对于repr,s对应str,a对应ascii formatspec等于[[fill]align][sign][#][0][width][.precision][typecode] 范例 '... {0} ... {1} ... {n}...'.format(1,2, ... n) '... {关键词1} ... {关键词2} ... {关键词n}...'.format(关键词1=值,关键词2=值, ... 关键词n=值) '... {字典名.[键]} ... {关键词.属性} ...'.format(字典,关键词=对象) //可以通过字典名和键返回format内对于字典键的值,也可以通过关键词调用对象的属性 现在虽然没有取消字符串格式化,但是字符串格式化方法已经覆盖了将近所有的字符串格式化,而且能够实现更加多的功能,在未来,字符串格式化可能会成为过去

匿名读者 03-06 13:50

幸好看了评论

Memory 03-30 03:21

同问:输入的数字是怎么传入hours_ahead()函数里的呀?有没有大佬帮忙解释一下的?

文艺小清新 10-23 08:34

之前的字符串格式化表达式说是要被废弃,采用字符串的格式化方法format(),但是现在字符串的格式化表达式使用仍然是十分广泛的,是不会过时的。。

对这一段的评论会显示在这里

在完成视图函数和URL配置编写后,启动Django开发服务器,用浏览器访问 http://127.0.0.1:8000/time/plus/3/ 来确认它工作正常。 然后是 http://127.0.0.1:8000/time/plus/5/ 。再然后是 http://127.0.0.1:8000/time/plus/24/ 。最后,访问 http://127.0.0.1:8000/time/plus/100/ 来检验URL配置里设置的模式是否只 接受一个或两个数字;Django会显示一个 Page not found error 页面, 和以前看到的 404 错误一样。 访问URL http://127.0.0.1:8000/time/plus/ (没有 定义时间差) 也会抛出404错误。

ttt 06-17 06:38

offset等于100的时候,int(offset)并不会报错啊,那http404是怎么raise出来的???

肖晗 12-01 03:38

/time/plus/100/没有404,估计是你的正则表达式多写的加号没有去掉,\d+表示至少1个数字,\d{1,2}表示只能1~2个数字,\d{1,2}+就是至少1~2个数字了(多了也可以)

梦不落 08-05 06:05

urls.py中,原为(r'^time/plus/\d+/$', hours_ahead),应该是(r'^time/plus/(\d+)/$', hours_ahead),少了对儿括号

nick.ye 06-05 08:22

用三位数进行传参也不会报错啊

对这一段的评论会显示在这里

Django 漂亮的出错页面

对这一段的评论会显示在这里

花几分钟时间欣赏一下我们写好的Web应用程序,然后我们再来搞点小破坏。 我们故意在 views.py 文件中引入一项 Python 错误,注释掉 hours_ahead 视图中的 offset = int(offset) 一行。

对这一段的评论会显示在这里
def hours_ahead(request, offset):
    # try:
    #     offset = int(offset)
    # except ValueError:
    #     raise Http404()
    dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
    html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt)
    return HttpResponse(html)
大橙猫 10-10 12:51

把捕捉异常的整个代码块都注释了,才出现漂亮的出错界面

对这一段的评论会显示在这里

启动开发服务器,然后访问 /time/plus/3/ 。你会看到一个包含大量信息的出错页,最上面 的一条 TypeError 信息是: "unsupported type for timedelta hours component: unicode" .

IvanKe93 09-16 01:04

我照着做了一遍,但是 TypeError 信息却是: unsupported type for timedelta hours component: str 请问哪里弄错了呀?

dou 10-23 07:57

应该是版本不一样

liaozhonghui 07-31 12:14

你这好像是正则表达式没加括号

对这一段的评论会显示在这里

怎么回事呢? 是的, datetime.timedelta 函数要求 hours 参数必须为整型, 而我们注释掉了将 offset 转为整型的代码。 这样导致 datetime.timedelta 弹出 TypeError 异常。

李根 05-07 05:50

为什么必须是整型

Clyde 06-04 08:07

回LS,这是函数对参数的要求,是写在函数里面的

对这一段的评论会显示在这里

这个例子是为了展示 Django 的出错页面。 我们来花些时间看一看这个出错页,了解一下其中 给出了哪些信息。

没钱没闲 03-14 08:51

这里的出错页面才是真正的精华。能看懂这些log。对于调试以及调查都是非常有用的。建议所有的人把这一段每行代表的意义都能背下来,真的非常有用

ivy 04-16 02:30

very good

Ansel 06-28 07:54

我的啥也没有,只显示“无法访问此网站,127.0.0.1 拒绝了我们的连接请求。”,求解~

Redim 02-20 14:09

python3默认会把错误信息显示在服务器端。 想看到404页面需要在函数里面添上一句: import sys sys.stderr = sys.stdout

对这一段的评论会显示在这里

以下是值得注意的一些要点:

对这一段的评论会显示在这里

在页面顶部,你可以得到关键的异常信息: 异常数据类型、异常的参数 (如本例中的 "unsupported type" )、在哪个文件中引发了异常、出错的行号等等。

对这一段的评论会显示在这里

在关键异常信息下方,该页面显示了对该异常的完整 Python 追踪信息。 这类似于你在 Python 命令行解释器中获得的追溯信息,只不过后者更具交互性。 对栈中的每一帧,Django 均显示了其文件名、函数或方法名、行号及该行源代码。

对这一段的评论会显示在这里

点击该行代码 (以深灰色显示),你可以看到出错行的前后几行,从而得知相关上下文情况。

对这一段的评论会显示在这里

点击栈中的任何一帧的“Local vars”可以看到一个所有局部变量的列表,以及在出错 那一帧时它们的值。 这些调试信息相当有用。

对这一段的评论会显示在这里

注意“Traceback”下面的“Switch to copy-and-paste view”文字。 点击这些字,追溯会 切换另一个视图,它让你很容易地复制和粘贴这些内容。 当你想同其他人分享这些异常 追溯以获得技术支持时(比如在 Django 的 IRC 聊天室或邮件列表中),可以使用它。

对这一段的评论会显示在这里

你按一下下面的“Share this traceback on a public Web site”按钮,它将会完成这项工作。 点击它以传回追溯信息至http://www.dpaste.com/,在那里你可以得到一个单独的URL并与其他人分享你的追溯信息。

对这一段的评论会显示在这里

接下来的“Request information”部分包含了有关产生错误的 Web 请求的大量信息: GET 和 POST、cookie 值、元数据(象 CGI 头)。 在附录H里给出了request的对象的 完整参考。

对这一段的评论会显示在这里

Request信息的下面,“Settings”列出了 Django 使用的具体配置信息。 (我们已经提及过ROOT_URLCONF,接下来我们将向你展示各式的Django设置。 附录D覆盖了所有可用的设置。)

对这一段的评论会显示在这里

Django 的出错页某些情况下有能力显示更多的信息,比如模板语法错误。 我们讨论 Django 模板系统时再说它们。 现在,取消 offset = int(offset) 这行的注释,让它重新正常 工作。

对这一段的评论会显示在这里

不知道你是不是那种使用小心放置的 print 语句来帮助调试的程序员? 你其实可以用 Django 出错页来做这些,而不用 print 语句。 在你视图的任何位置,临时插入一个 assert False 来触发出错页。 然后,你就可以看到局部变量和程序语句了。 这里有个使用hours_ahead视图的例子:

zhongqi 02-06 14:47

assert False仅仅是为了调试用?

louis 09-18 08:26

加了assert False 这句之后页面会出错。 AssertionError at /time/plus/3/

匿名读者 09-22 16:21

应加 assert True吧,assert是条件为假时才报错的啊

ayla 11-02 03:37

1.4 里,assert False之后,没有任何异样

aska 11-26 08:45

在1.4下面也生效的

Robert 05-03 15:01

assert是什么?

Jack 06-16 09:26

assert是断言的意思 如果assert后面跟的值是False,那么就抛出错误;如果跟的是True,就会继续往下执行

对这一段的评论会显示在这里
def hours_ahead(request, offset):
    try:
        offset = int(offset)
    except ValueError:
        raise Http404()
    dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
    assert False
    html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt)
    return HttpResponse(html)
对这一段的评论会显示在这里

最后,很显然这些信息很多是敏感的,它暴露了你 Python 代码的内部结构以及 Django 配置,在 Internet 上公开这信息是很愚蠢的。 不怀好意的人会尝试使用它攻击你的 Web 应用程序,做些下流之事。 因此,Django 出错信息仅在 debug 模式下才会显现。 我们稍后 说明如何禁用 debug 模式。 现在,你只要知道 Django 服务器在你开启它时默认运行在 debug 模式就行了。 (听起来很熟悉? 页面没有发现错误,如前所述,工作正常。)

kuber 12-31 07:22

"The “Page not found” errors, described earlier in this chapter, work the same way.)" 前面提到的“Page not found” 错误工作原理也是一样的

Lubi 04-26 00:01

...写下流不太好吧。

DDGG 12-29 11:10

用“下三滥”这个词会比较好一点,哈哈。

Maka 07-11 02:56

下流之事哈哈哈哈哈哈

xudshen 11-29 07:56

做些羞羞的事情

呆滞的慢板 01-27 08:38

哈哈!看到“下流”这里就有点突兀,马上点进来看看大家的意见,原来都觉得有点那个。。不过其实对于理解来说还是挺恰当的。

dengyaolong 06-12 03:45

原来攻击网站是下流的事阿!

leale 09-01 07:53

好多下流的人呀^_^

urmyfaith 09-13 04:46

下流的事情...==

misutt 10-17 13:59

看到“下流的事”我就进来看评论了~哈哈哈

YouthLin 05-23 15:15

你们这群下流的淫(逃

匿名读者 08-03 02:06

下流666

匿名读者 03-10 12:00

下流。。。

匿名读者 04-18 02:32

评论比文章好看。。

对这一段的评论会显示在这里

下一章

对这一段的评论会显示在这里

目前为止,我们已经写好了视图函数和硬编码的HTML。 在演示核心概念时,我们所作的是为了保持简单。但是在现实世界中,这差不多总是个坏主意。

kuber 12-31 07:23

nearly: "差不多"建议改成"基本上"

ssh2free 10-29 04:27

“下一章“缺少链接

Hong 01-29 17:36

差不多是个坏主意,哈哈。我觉得是个好主意~

御坂御坂 08-29 01:32

备注:硬编码是指将可变变量用一个固定值来代替的方法

YYF 10-01 05:03

继续保持简单

lol 09-16 03:55

硬编码一般指在代码中写死的,与它相对的是配置项,可以在程序发布后进行修改的 来自:https://zhidao.baidu.com/question/433037849795897284.html

对这一段的评论会显示在这里

幸运的是,Django内建有一个简单有强大的模板处理引擎来让你分离两种工作: 下一章,我们将学习模板引擎。

卿云 01-08 11:28

'又'错写成'有'

S@M 04-26 15:09

没有错吧……应该是“有”

YouthLin 05-23 15:20

有一个简单【又】强大

对这一段的评论会显示在这里