使用TDD理解views.py与urls.py的关系

首先必须对MVC的概念有初步的认识,django也遵循这样一套规范,views.py相当于视图函数,是整个架构中的处理引擎,而urls.py的作用就是将用户请求送入这样的引擎。

项目结构:

urls.py:

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

urlpatterns = [
    # Examples:
    #url(r‘^$‘, ‘mysite.views.home‘, name=‘home‘),
    # url(r‘^blog/‘, include(‘blog.urls‘)),

    url(r‘^admin/‘, include(admin.site.urls)),
]

views.py:

from django.shortcuts import render

单元测试代码片段:tests.py

from django.test import TestCase
from django.core.urlresolvers import resolve
from list.views import home_page

class testcase(TestCase):
    def test_resolve(self):
        found = resolve("/")
        self.assertEqual(found.func,home_page)

使用命令执行单元测试:python3 manage.py test

输出如下:

 1 reating test database for alias ‘default‘...
 2 E
 3 ======================================================================
 4 ERROR: list.tests (unittest.loader.ModuleImportFailure)
 5 ----------------------------------------------------------------------
 6 Traceback (most recent call last):
 7   File "/usr/lib/python3.4/unittest/case.py", line 58, in testPartExecutor
 8     yield
 9   File "/usr/lib/python3.4/unittest/case.py", line 577, in run
10     testMethod()
11   File "/usr/lib/python3.4/unittest/loader.py", line 32, in testFailure
12     raise exception
13 ImportError: Failed to import test module: list.tests
14 Traceback (most recent call last):
15   File "/usr/lib/python3.4/unittest/loader.py", line 312, in _find_tests
16     module = self._get_module_from_name(name)
17   File "/usr/lib/python3.4/unittest/loader.py", line 290, in _get_module_from_name
18     __import__(name)
19   File "/home/django/mysite3/list/tests.py", line 3, in <module>
20     from list.views import home_page
21 ImportError: cannot import name ‘home_page‘
22
23
24 ----------------------------------------------------------------------
25 Ran 1 test in 0.001s
26
27 FAILED (errors=1)
28 Destroying test database for alias ‘default‘...

根据提示,20~21行显示没有home_page 对象,所以改写views.py,如下:

 1 [email protected]:/home/django/mysite3# python3 manage.py test
 2 Creating test database for alias ‘default‘...
 3 E
 4 ======================================================================
 5 ERROR: test_resolve (list.tests.testcase)
 6 ----------------------------------------------------------------------
 7 Traceback (most recent call last):
 8   File "/home/django/mysite3/list/tests.py", line 7, in test_resolve
 9     found = resolve("/")
10   File "/usr/local/lib/python3.4/dist-packages/django/core/urlresolvers.py", line 522, in resolve
11     return get_resolver(urlconf).resolve(path)
12   File "/usr/local/lib/python3.4/dist-packages/django/core/urlresolvers.py", line 388, in resolve
13     raise Resolver404({‘tried‘: tried, ‘path‘: new_path})
14 django.core.urlresolvers.Resolver404: {‘path‘: ‘‘, ‘tried‘: [[<RegexURLResolver <RegexURLPattern list> (admin:admin) ^admin/>]]}
15
16 ----------------------------------------------------------------------
17 Ran 1 test in 0.005s
18
19 FAILED (errors=1)
20 Destroying test database for alias ‘default‘...

根据19行提示,路径问题,没有正确将请求如果到指定的应用,改写urls.py:

 1 from django.conf.urls import include, url
 2 from django.contrib import admin
 3
 4 urlpatterns = [
 5     # Examples:
 6     url(r‘^$‘, ‘mysite.views.home‘, name=‘home‘),
 7     # url(r‘^blog/‘, include(‘blog.urls‘)),
 8
 9     url(r‘^admin/‘, include(admin.site.urls)),
10 ]

进行单元测试:

 1 [email protected]:/home/django/mysite3# python3 manage.py test
 2 Creating test database for alias ‘default‘...
 3 E
 4 ======================================================================
 5 ERROR: test_resolve (list.tests.testcase)
 6 ----------------------------------------------------------------------
 7 Traceback (most recent call last):
 8   File "/usr/local/lib/python3.4/dist-packages/django/core/urlresolvers.py", line 106, in get_callable
 9     mod = import_module(mod_name)
10   File "/usr/lib/python3.4/importlib/__init__.py", line 109, in import_module
11     return _bootstrap._gcd_import(name[level:], package, level)
12   File "<frozen importlib._bootstrap>", line 2254, in _gcd_import
13   File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
14   File "<frozen importlib._bootstrap>", line 2212, in _find_and_load_unlocked
15   File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed
16   File "<frozen importlib._bootstrap>", line 2254, in _gcd_import
17   File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
18   File "<frozen importlib._bootstrap>", line 2224, in _find_and_load_unlocked
19 ImportError: No module named ‘mysite‘
20
21 During handling of the above exception, another exception occurred:
22
23 Traceback (most recent call last):
24   File "/home/django/mysite3/list/tests.py", line 7, in test_resolve
25     found = resolve("/")
26   File "/usr/local/lib/python3.4/dist-packages/django/core/urlresolvers.py", line 522, in resolve
27     return get_resolver(urlconf).resolve(path)
28   File "/usr/local/lib/python3.4/dist-packages/django/core/urlresolvers.py", line 368, in resolve
29     sub_match = pattern.resolve(new_path)
30   File "/usr/local/lib/python3.4/dist-packages/django/core/urlresolvers.py", line 240, in resolve
31     return ResolverMatch(self.callback, args, kwargs, self.name)
32   File "/usr/local/lib/python3.4/dist-packages/django/core/urlresolvers.py", line 247, in callback
33     self._callback = get_callable(self._callback_str)
34   File "/usr/lib/python3.4/functools.py", line 448, in wrapper
35     result = user_function(*args, **kwds)
36   File "/usr/local/lib/python3.4/dist-packages/django/core/urlresolvers.py", line 112, in get_callable
37     if submod and not module_has_submodule(import_module(parentmod), submod):
38   File "/usr/lib/python3.4/importlib/__init__.py", line 109, in import_module
39     return _bootstrap._gcd_import(name[level:], package, level)
40   File "<frozen importlib._bootstrap>", line 2254, in _gcd_import
41   File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
42   File "<frozen importlib._bootstrap>", line 2224, in _find_and_load_unlocked
43 ImportError: No module named ‘mysite‘
44
45 ----------------------------------------------------------------------
46 Ran 1 test in 0.031s
47
48 FAILED (errors=1)
49 Destroying test database for alias ‘default‘...

43行提示,不是正确的module,根据时间环境修改urls.py如下:

 1 from django.conf.urls import include, url
 2 from django.contrib import admin
 3
 4 urlpatterns = [
 5     # Examples:
 6     url(r‘^$‘, ‘list.views.home_page‘, name=‘home‘),
 7     # url(r‘^blog/‘, include(‘blog.urls‘)),
 8
 9     url(r‘^admin/‘, include(admin.site.urls)),
10 ]

进行单元测试:

1 [email protected]:/home/django/mysite3# python3 manage.py test
2 Creating test database for alias ‘default‘...
3 .
4 ----------------------------------------------------------------------
5 Ran 1 test in 0.003s
6
7 OK
8 Destroying test database for alias ‘default‘...

7行显示,成功。

所以,可以看出,此案中,测试函数用于查找“/”目录下的home_page对象,urls.py接受用户请求后,根据正则进行匹配,定向到list应用的views模块的home_page对象

reating test database for alias ‘default‘...E======================================================================ERROR: list.tests (unittest.loader.ModuleImportFailure)----------------------------------------------------------------------Traceback (most recent call last):  File "/usr/lib/python3.4/unittest/case.py", line 58, in testPartExecutor    yield  File "/usr/lib/python3.4/unittest/case.py", line 577, in run    testMethod()  File "/usr/lib/python3.4/unittest/loader.py", line 32, in testFailure    raise exceptionImportError: Failed to import test module: list.testsTraceback (most recent call last):  File "/usr/lib/python3.4/unittest/loader.py", line 312, in _find_tests    module = self._get_module_from_name(name)  File "/usr/lib/python3.4/unittest/loader.py", line 290, in _get_module_from_name    __import__(name)  File "/home/django/mysite3/list/tests.py", line 3, in <module>    from list.views import home_pageImportError: cannot import name ‘home_page‘

----------------------------------------------------------------------Ran 1 test in 0.001s
FAILED (errors=1)Destroying test database for alias ‘default‘...

时间: 2024-08-25 22:55:08

使用TDD理解views.py与urls.py的关系的相关文章

4.对urls.py的解释

解释: 路由配置文件(URL分发器),它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表.就是以这种方式告诉Django对于每个URL的处理类.Django启动的时候回去加载urls.py文件,加载那个文件可以在hello_django\hello_django\setting.py中通过ROOT_URLCONF配置,如ROOT_URLCONF = 'hello_django.urls'(默认配置) 理解: 相当于spring mvc里的@RequestMapping的作用 基本

python+django 更改了urls.py 之后runserver报错的解决办法

新手学python+django时,更改了urls.py 为: from django.conf.urls import patterns, include, urlfrom django.contrib import adminadmin.autodiscover() urlpatterns = patterns('',    # Examples:    # url(r'^$', 'mysite.views.home', name='home'),    # url(r'^blog/', i

Django urls.py报错: raise TypeError(&#39;view must be a callable or a list/tuple in the case of include()

Django urls.py报错: raise TypeError('view must be a callable or a list/tuple in the case of include() 报错信息 "F:\PyCharm 2016.2.2\bin\runnerw.exe" C:\Users\Administrator\AppData\Local\Programs\Python\Python35\python.exe F:/Django/blogs/manage.py run

第三百零四节,Django框架,urls.py模块——

Django框架,模块 一.urls.py模块 这个模块是配置路由映射的模块,当用户访问一个url地址时,通过这个路由映射模块,映射给对应的逻辑处理函数 urlpatterns等于的一个列表,列表里的一个元素就是一条路由映射 urlpatterns路由映射配置方式 参数说明: 一个正则表达式字符串一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串可选的要传递给视图函数的默认参数(字典形式)一个可选的name参数 urlpatterns = [ url(正则表达式, 映射函数,参数[

urls.py中url匹配的方式

方式一: [[email protected] muahao01]# vim urls.py from django.conf.urls import patterns, include, url from django.contrib import adminfrom blog.views import indexurlpatterns = patterns('',    # Examples:    # url(r'^$', 'muahao01.views.home', name='home

Django入门三之urls.py重构及参数传递

1. 内部重构 2. 外部重构 website/blog/urls.py website/website/urls.py 3. 两种参数处理方式 -1. blog/index/?id=1234&name=bikmin #urls.py url(r'^blog/index/$','get_id_name')  #views.py from django.http import HttpResponse from django.template import loader,Context def g

django之创建第7-3个项目-在站点blog下单独创建urls.py文件

1.在站点blog下单独创建urls.py文件 # -*- coding: UTF-8 -*- from django.conf.urls import patterns, include, url urlpatterns = patterns('blog.views', url(r'^index/$', 'index'), url(r'^time/$', 'time'), url(r'^shengfen/$', 'shengfen'), ) 2.修改项目的urls.PY文件(非站点哦) # -

Django 笔记 05 urls.py详解

urls.py: URL分发器(路由配置文件) URL配置(URLconf )就像是 Django 所支撑网站的目录.它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间的映射表. 你就是以这种方式告诉 Django,对于这个 URL 调用这段代码,对于那个 URL 调用那段代码.URL的加载是从配置文件中开始的. 执行 django-admin.py startproject 时,该脚本会自动为你建了一份 URLconf(即 urls.py 文件).在同时自动创建的setting

Python的Django框架完成一个完整的论坛(2.urls.py配置、静态文件)

最终效果:http://www.cnblogs.com/xuyiqing/p/8274912.html urls.py配置: """BlogTest URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/2.0/topics/http/urls/ Examples: Fun