zoukankan      html  css  js  c++  java
  • Django-website 程序案例系列-3 URL详解

    django参考资料:http://docs.30c.org/djangobook2/index.html

    urls.py是django中控制接收前端的参数指定函数去执行逻辑

    第一种 函数的方式

    url(r'^login/', views.login)  接收login/  去执行views.py里面的login函数(一个url对应一个函数)
    def login(request):
      pass

    第二种 使用类的方式

    url(r'^home/', views.Home.as_view())  接收home/  去执行views.py里面的login函数(一个url对应一个类)

    from django.views import View
    class Home(View):
      
    def dispatch(self,request,*args,**kwargs): #在执行get和post之前执行这里面的代码,可以实现执行前和执行后的功能
        print('before') #执行前执行代码
        result = super(Home,self).dispatch(request,*args,**kwargs)
        print('after') #执行后执行代码
        return result        

      def get(self,request): #get方式
        print(request.method)
        return render(request,'home.html')
      def post(self,request): #post方式
       print(request.method)
        return render(request,'home.html')

    url中增加参数:
    USER_DICT = {        #增加全局字典
    'k1': 'root1',
    'k2': 'root2',
    'k3': 'root3',
    }
    url(r'^detail/', views.detail)      #增加一个新的url

    def detail(request):                #url处理的函数
    nid = request.GET.get('nid')
    return HttpResponse(nid)
    
    
    <ul>
    {% for k, v in user_dict.items %}
    <li><a href="/detail/?nid={{ k }}" target="_blank">{{ v }}</a></li> #给url传参数(一个系列的url对应一个函数)
    {% endfor %}
    </ul>
    取参数1-来拿到详细信息:

    url(r'^detail/', views.detail)      #一个系列的url对应一个函数detail
    USER_DICT = {
    '1': {'name': 'root1', 'email': 'root1@123.com'},
    '2': {'name': 'root2', 'email': 'root2@123.com'},
    '3': {'name': 'root3', 'email': 'root3@123.com'},
    }

    def detail(request):
    nid = request.GET.get('nid')
    detail_info = USER_DICT[nid] #取出nid,然后拿字典的值
    return render(request, 'detail.html', {'detail_info': detail_info}) #取值传回前端页面

    <body>                    #显示详细信息 detail.html
    <h1>详细信息</h1>
    <h6>用户名:{{ detail_info.name }}</h6>
    <h6>邮箱:{{ detail_info.email }}</h6>
    </body>

    取参数2-来拿到详细信息:
    url(r'^detail-(d+)', views.detail)    #使用正则取出参数(d+)
    <ul>
    {% for k, v in user_dict.items %}
    <li><a href="/detail-{{ k }}.html" target="_blank">{{ v.name }}</a></li> #url也要改变
    {% endfor %}
    </ul>
    def detail(request, nid):     #函数需要增加参数 nid
    detail_info = USER_DICT[nid]
    return render(request, 'detail.html', {'detail_info': detail_info})

    url正则表达式匹配规则:
    <1>
    url(r'^detail-(d+)-(d+)', views.detail), #使用正则取2个参数

    def detail(request, nid, uid): #使用nid,uid两个参数来接收,参数接收有顺序要求
       n = nid
       u = uid
    <2>
    url(r'^detail-(?P<nid>d+)-(?P<uid>d+)', views.detail), #使用正则分组匹配取2个参数
    def detail(request, nid, uid):     #使用nid,uid两个参数来接收,参数接收没有顺序要求
       n = nid
       u = uid

    <3>
    url(r'^detail-(d+)-(d+)', views.detail),   #使用正则取2个参数
    arg=(1,2,...) #传的参数
    def detail(request, *args, **kwargs): # 两个参数传递到args里面
       arg = (1,2,...) # 由*args来接收,接收后的arg是一个元组,根据元组索引取值
    url(r'^detail-(?P<nid>d+)-(?P<uid>d+)', views.detail),   #使用正则分组匹配取2个参数
    arg={'nid':1,'uid':2,..} #传的参数
    def detail(request, *args, **kwargs):     # nid,uid两个参数传递到kwargs里面
       kwarg = {'nid':1,'uid':2,...} # 由**kwargs来接收,接收后的arg是一个字典

    <4>
    对url路由关系进行命名,以后可以根据名字生成自己想要的url

    url(r'^app1index/', view.index, name='index') #将appindex命名为index
    {% url "index" %} #在模板语言中就可以这么用

    url(r'^app1index/(d+)/', view.index, name='index') #将appindex/(d+)/命名为index
    {% url "index" 3 %} #在模板语言中可以给url传参数
    #返回当前页面
    {{ request.pathinfo }} #表示当前页面的url
    #函数生成当前页面
    def detail(request, nid): #通过函数生成一个url
       from django.urls import reverse #导入reverse函数
       v = reverse('index', args=(90,)) #通过reverse函数生成url appindex/90/
    url(r'^appindex/(?P<nid>d+)/(?P<uid>d+)/', view.index, name='index')
    def detail(request, nid, uid): #通过函数生成一个url
       from django.urls import reverse #导入reverse函数
       v = reverse('index', kwargs={'nid':90,'uid':88,}) #通过reverse函数生成url appindex/90/88/
    {% url "index" nid=1 uid=3 %} #模板语言中可以这样用
    路由分发url-include函数:

    urls.py
    from django.conf.urls import url,include #导入include函数

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    url(r'^cmdb/', include("app01.urls")), #通过include函数连接app01下面的urls.py
    url(r'^monitor/', include("app02.urls")), #通过include函数连接app02下面的urls.py
    ]
    访问方式: 127.0.0.1:8000/cmdb/login/   127.0.0.1:8000/monitor/login/

    设置默认路由:
     #定义默认访问路由,表示输入任意url路径
     url(r'^$', views.default_index),

    命名空间:
    a. project.urls.py
      from django.conf.urls import url,include
       urlpatterns = [
        url(r'^a/', include('app01.urls', namespace='author-polls')),
        url(r'^b/', include('app01.urls', namespace='publisher-polls')),
      ]
    b. app01.urls.py
    from django.conf.urls import url
    from app01 import views
      app_name = 'app01'
      urlpatterns = [
        url(r'^(?P<pk>d+)/$', views.detail, name='detail')
      ]
        c. app01.views.py
     def detail(request, pk):
        print(request.resolver_match)
        return HttpResponse(pk)

    以上定义带命名空间的url之后,使用name生成URL时候,应该如下:

    • v = reverse('app01:detail', kwargs={'pk':11})
    • {% url 'app01:detail' pk=12 pp=99 %}

    django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而是路由系统变得简洁。

     给URL设置默认参数:
     
    url(r'^indexe/', views.indexe, {'name': 'url'}),  #{'name': 'url'}是给indexe函数传递的默认参数

    函数接收:
    def indexe(request, name):    #使用name来接收默认参数
    print(name)
    return HttpResponse('wegwegwegwefew')


  • 相关阅读:
    Codeforces Round #652 (Div. 2) A. FashionabLee(几何)
    轻量应用服务器如何通过修改apache配置文件实现非https的访问多域名到不同子目录程序?
    在Windows环境下使用hexo搭建博客以及部署到gitee / github
    使用WordPress搭建个人手机博客(阿里云)
    访问自己服务器的ip地址
    php环境无法上传文件的解决方法
    SSRF漏洞
    CSRF全家桶(含义,防御,攻击)
    JS实现HTML实体与字符的相互转换
    CentOS系统下载及应用部署
  • 原文地址:https://www.cnblogs.com/kuku0223/p/7840057.html
Copyright © 2011-2022 走看看