`
yzjklove
  • 浏览: 63745 次
  • 性别: Icon_minigender_1
  • 来自: 广东省惠州市
社区版块
存档分类
最新评论

Django笔记-URLConf Views

阅读更多
一、库文件导入问题




1. from django.conf.urls.defaults import *
from website.contact.views import contact, thanks
#这种方法导入不好,因为随着views数量的增多,在每次加入
#新的view函数时还得确认是否已经导入了这个函数。
#如果项目非常大 则管理起来非常困难。
#另外导入语句过长也影响了代码的美观程度。


urlpatterns = patterns('',
(r'^contact/$', contact),
(r'^thanks/$', thanks),
)
2. from django.conf.urls.defaults import *
#一种不需要导入函数的更好的写法
urlpatterns = patterns('website.contact.views',
#这种写法不需要导入view函数,django会自动导入需要的视图函数
#但是这里组要必须用字符串'contact’,而不是函数
(r'^contact/$', 'contact'),
(r'^thanks/$', 'thanks'),
)

#如果多个共通头,还可以这样
urlpatterns = patterns('website.contact.views',
(r'^contact/$', 'contact'),
(r'^thanks/$', 'thanks'),
)

#if xxx:#在这里加上条件判断还可以有选择的将app加入到web中。
urlpatterns += patterns('website.blog.views',
(r'^index/$', 'index'),
)
例如:
from django.conf import settings
from django.conf.urls.defaults import *
from mysite import views

urlpatterns = patterns('',
    (r'^$', views.homepage),
    (r'^(\d{4})/([a-z]{3})/$', views.archive_month),
)

if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^debuginfo/$', views.debug),
    )

3. from website.contact.views import *
#* 表示,该模块的所有公共对象(public objects)都被导入到 当前的名称空间,
#也就是任何只要不是以”_”开始的东西都会被导入,views里面所有的代码,包括import的东
#西都会import的,所以这个方法是绝对不能用的。
urlpatterns = patterns('',
(r'^contact/$', contact),
(r'^thanks/$', thanks),
)

4.from website.contact import views
#推荐方法,这个更pyhtonic
#而且控制起来也方便。
from website.contact import views
urlpatterns = patterns('',
(r'^contact/$', views.contact),
(r'^thanks/$', views.thanks),
)



二、给views函数传递参数


1.传递参数的两种方法


1)Using Named Groups, non-named regular expression groups
也叫Keyword Arguments vs. Positional Arguments。位置参数和关键字参数
2)Passing Extra Options to View Functions(见本节2中的例子)
别名英语称呼:从正则表达式传递过来的参数Captured Values,从额外字典传递的参数Extra Options

2. 正则表达式可以用在URLconf中。
URLconf parameter可以起名字,也可以用位置参数传递给views函数。
这里的正则表达式没有啥特殊的,需要传递的参数用小括号括起来。有一点要注意,
定义参数名时用?P例如定义一月中的某一天 (?P<day>\d\d)

3.不把变量放在URL中
如下所述bar_view同foo_view处理内容是相同的,只是模板不同而已,下面例子中
变量不用放在网址中即可显示不同的参数。即网址r'^foo/$'的变动不会影响处理。
该方法在某些方面用起来非常方便,最好的例子应该是generic views system的应用了。

# urls.py
from django.conf.urls.defaults import *
from mysite import views

urlpatterns = patterns('',
    (r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}),
    (r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}),
)

# views.py
from django.shortcuts import render_to_response
from mysite.models import MyModel

def foobar_view(request, template_name):
    m_list = MyModel.objects.filter(is_new=True)
    return render_to_response(template_name, {'m_list': m_list})  
3.字典参数传递的变量比正则表达式变量优先级高
例子:
urlpatterns = patterns('',
    (r'^mydata/(?P<id>\d+)/$', views.my_view, {'id': 3}),
)

虽然请求url中值为22 ,http://127.0.0.1/mydata/22 但是传递的ID参数为3


三、URLPattern技巧

1.不要将URL逻辑处理放在Views中


URL是多变的,views的处理最好不要包含URL逻辑的处理。
不多说,看下面的例子:
urlpatterns = patterns('',
#...........
('^auth/user/add/$', views.user_add_stage),#1
('^([^/]+)/([^/]+)/add/$', views.add_stage),#2
#..........
显然,#2模式是包括#1的URL的,但是,这里/auth/user/add这个
网址需要特殊处理,如果是在views中处理应该是这样子的。显然
如果对应的URL变化了,views函数很快就不适应了。所以这样子不好。
def add_stage(request, app_label, model_name):
    if app_label == 'auth' and model_name == 'user':
        # do special-case code
    else:
        # do normal code

  (r'^somepage/$', views.method_splitter, {'GET': views.some_page_get, 'POST': views.some_page_post}),
    # ...

2.封装view函数
如下面代码,很冗余
def my_view1(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/accounts/login/')
    # ...
    return render_to_response('template1.html')

def my_view2(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/accounts/login/')
    # ...
    return render_to_response('template2.html')

def my_view3(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/accounts/login/')
    # ...
    return render_to_response('template3.html')



怎么样把他简化呢?看下面这个封装函数
def requires_login(view):
    def new_view(request, *args, **kwargs):
        if not request.user.is_authenticated():
            return HttpResponseRedirect('/accounts/login/')
        return view(request, *args, **kwargs)
    return new_view



经过封装后,代码可以极大的简化,URLPattern应该是这个样子
from django.conf.urls.defaults import *
from mysite.views import requires_login, my_view1, my_view2, my_view3

urlpatterns = patterns('',
    (r'^view1/$', requires_login(my_view1)),
    (r'^view2/$', requires_login(my_view2)),
    (r'^view3/$', requires_login(my_view3)),
)



四、包含其他URLConfs


1.gotcha
用include的正则表达式,不能包含$来表示结尾,另外结尾必须有/
例如:"r^/http/" -OK       "r^/http/$"NG

2.参数传递
如果被包含的urls接受了一个参数,那么他会传递给任意一个include里面
的views函数。

同样 Extra URLconf Options 也会传递下层被包含的每一个url中。
例子:下面的两个是等同的。

Set one:
# urls.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
    (r'^blog/', include('inner'), {'blogid': 3}),
)
# inner.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
    (r'^archive/$', 'mysite.views.archive'),
    (r'^about/$', 'mysite.views.about'),
    (r'^rss/$', 'mysite.views.rss'),
)
##############################################################
Set two:
# urls.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
    (r'^blog/', include('inner')),
)
# inner.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
    (r'^archive/$', 'mysite.views.archive', {'blogid': 3}),
    (r'^about/$', 'mysite.views.about', {'blogid': 3}),
    (r'^rss/$', 'mysite.views.rss', {'blogid': 3}),
)

分享到:
评论

相关推荐

    python1903笔记 08-Django.zip

    Python1903笔记系列是针对初学者和进阶者的一套教程,专注于Django框架的学习。Django是一个高级的Python Web框架,它鼓励快速开发和实用主义设计,遵循“干(Don't Repeat Yourself)”的原则。这个压缩包"08-...

    Django架构操作笔记

    在 `myweb/settings.py` 文件中查找 `ROOT_URLCONF` 设置项,其值应为 `'myweb.urls'`。 2. 在 `myweb/urls.py` 文件中定义 URL 路由,例如: ```python from django.urls import path from myapp import views...

    基于Django实现云笔记项目.zip

    在本项目"基于Django实现云笔记项目.zip"中,我们探索了如何使用Python的Django框架构建一个云笔记应用程序。这个项目可以帮助开发者学习Django的基本概念,以及如何将其应用于实际项目开发。以下是对该项目涉及的...

    Django-Notes:Djanogo笔记

    【Django笔记】是关于Django框架的一系列学习记录,旨在深入理解并掌握这个流行的Python Web开发框架。Django是一个高效、强大且易用的开源Web应用框架,它遵循模型-视图-控制器(MVC)的设计模式,但在Django中被...

    2023.07月基于Django开发的学习笔记博客及网站后台管理系统源码.zip

    4. **URL配置(URLConf)**:Django通过URLConf将URL映射到相应的视图函数,实现URL路由。每个URL模式对应一个视图,使得用户可以通过特定的URL访问到特定的功能。 5. **表单(Forms)**:Django的表单模块简化了...

    Django step and step 1.02实践(源码加笔记)

    URL配置(URLconf)将URL映射到视图。在`myproject/urls.py`中,设置URL模式: ```python from django.urls import path from myapp.views import user_list urlpatterns = [ path('users/', user_list, name='...

    django基础语法,从小白到入门

    **Django基础语法详解:从小白到入门** Django,作为一个强大的Python Web框架,是许多开发者构建高效、安全且易于维护的网站的首选工具。它以其MVC(Model-View-Controller)架构模式为基础,提供了丰富的功能,如...

    django架构学习

    通过这个项目,开发者可以深入理解Django的模型(Models)、视图(Views)、模板(Templates)和URL(URLconf)这四个主要组件的用法,以及如何在实际项目中整合这些组件以实现功能丰富的Web应用。此外,还会涉及...

    Build-Your-APP-With-Django:使用Django构建您的APP

    在"Build-Your-APP-With-Django-master"这个压缩包中,很可能包含了实现上述概念和功能的代码示例、教程文档或笔记,可以帮助学习者更好地理解和应用Django。建议按照文件结构和说明逐步学习,实践操作,以提高对...

    django_belkin:Курспоdjango

    7. **URL路由(URL Routing)**:Django使用URLconf系统将URL映射到视图,让你能控制URL设计和结构。 8. **表单(Forms)**:Django提供强大的表单处理能力,可以自动生成HTML表单,处理用户输入,进行验证并保存...

Global site tag (gtag.js) - Google Analytics