* url映射
* 传递参数  
* 应用命令空间  
* 默认参数

## 昨天遇到的问题

* windows 中 用户名 不要写成中文   
* 如果说 遇到 mkvirtualenv  workon 命令找不到  
  * 将 C:\Python\Python36\Scripts (python安装目录 下面有 mkvirtualenv.bat的脚本)加到环境变量  
  * 所有的虚拟环境 默认创建在 用户/你的用户名/Envs  解决方案  系统变量中新建  WORKON_HOME 参数 : 新的地址  不能有中文   
  * 创建虚拟环境的时候 指定python路径  如果路径中 有空格  解决方案  --python=""

路径加上双引号

## url 传递参数

vim book应用下   views.py

```
from django.shortcuts import render #这个render 用来渲染模板 后期会学到
from django.http import HttpResponse

def book(request):
    return HttpResponse("图书首页 多读书多看报少吃零食多睡觉")
def book_detail(request,book_id): #通过参数将book_id传递过去
    text = "您要请求的图书id为:%s" % book_id
    return HttpResponse(text)
    
def author_detail(request):
    author_id = request.GET['id']  #用来接收 用户在url中传递过来的参数 
    text = '作者的id是:%s' % author_id 
    #http://127.0.0.1:9000/book/author/?id=5
    return HttpResponse(text)
def book_detail(request,book_id,category_id): #传递两个参数的时候  
    text = "您要请求的图书id为:%s 图书类目id为: %s" % (book_id,category_id) 括号隔开  
    return HttpResponse(text)
```

vim 项目下 urls.py

```
from django.urls import path
from django.http import HttpResponse
from book import views
def index(request):
    return HttpResponse('首页')
urlpatterns = [
    path('',index),
    path('book/',views.book),
    path('book/detail/<book_id>/',views.book_detail),
    path('book/author/',views.author_detail),#author没有参数
    path('book/detail/<book_id>/<category_id>',views.book_detail)#使用<> 传递参数  记住  <里边的变量> 要跟应用views下面的 参数一样  跟上面的 book_id 一样
]
```

### 指定参数的类型

```
def publisher_detail(request,publisher_id):
    text = '出版社的id是:%s' % publisher_id
    return HttpResponse(text)
from django.urls import converters (鼠标放上去 ctrl+点击)    
path('book/publisher/<path:publisher_id>',views.publisher_detail)
path('book/publisher/<int:publisher_id>',views.publisher_detail)
path('book/publisher/<uuid:publisher_id>',views.publisher_detail)
path('book/publisher/<slug:publisher_id>',views.publisher_detail)
int 只能是一个或者多个整型数字  
path 所有字符都能满足  dc9c10b6-b153-4a25-a102-44cc0e1eb5ea  import uuid  print(uuid.uuid4())
str 除了  /之外的都可以 
slug '[-a-zA-Z0-9_]+'

当 <> 里边 不写 int  str uuid  默认是 匹配str 
```

## urls模块化

> 如果项目越来越大  模块越来越多  我们需要在项目主目录下 urls 添加多行 path()
>
> 每个app 自己的url 自己管理   
>
> 首选 需要在 应用 中创建一个新文件   urls.py

vim book/urls.py

```
from django.urls import path
from . import views
urlpatterns = [
    path('',views.book),
    path('detail/<book_id>/',views.book_detail) 
]
```

vim book/views.py

```
from django.shortcuts import render
from django.http import HttpResponse
def book(request):
    return HttpResponse("图书首页")
def book_detail(request,book_id):
    text = "图书id为:%s" % book_id
    return HttpResponse(text)

# Create your views here.

```

vim 主目录下面的urls.py

```
from django.urls import path,include
urlpatterns = [
    path('book/',include('book.urls')), #这里边 book后面加了/   app 下面的urls.py 注意不要多加/  urls是拼接起来的   
]
```

## urls 命名 及 命名空间

> 为什么要给url命名

```
因为url 是经常变化的 如果在代码中写死 可能会经常该代码  给 url 起个名字 以后使用的时候  对名字进行反转 获取到修改后的url  这时候就不需要写死代码

示例代码 : 
    def index(request):
    username = request.GET.get('username')
    if username:
        return HttpResponse("后台首页")
    else:
        login_url = reverse('front:login')
        print(login_url)
        # return redirect('/signup/') 这是写死的情况
        #最好是个变量
        return redirect(login_url)

```

### app 命名空间 在app 下面的 urls.py中 命名

```
多个app之间 可能产生相同的url  为了避免 reverse('url名字')产生混乱 可以使用命名空间来区分  定义命名空间只需要在 app 下 urls.py 下面 app_name = '新名字'
revser() 就变成了   reverse('新名字:url名字');

示例代码:  cms 下 url 
app_name = 'cms'
urlpatterns = [
    path('',views.index,name='index'),
    path('signup/',views.login,name='login')  name这里是给url起名字  
]
```

### 实例命名空间   在主目录下面的urls.py下 命名

```
一个app 可以拥有多个实例  多个url 可以映射同一个 app 好比 公司有一套后台管理系统    a组 只能通过http://127.0.0.1:9000/cms1   b组只能通过 http://127.0.0.1:9000/cms2

主目录的 urls.py
from django.urls import path,include
urlpatterns = [
    path('',include('front.urls')),
    path('cms1/',include('cms.urls',namespace='cms1')),
    path('cms2/',include('cms.urls',namespace='cms2')), #多个url 指向一个 app 
]
views.py
        #当你用cms1访问的时候 用cms1的命名空间
        #cms2访问  用cms2的命名空间
        #获取当前的命名空间
        current_namespace = request.resolver_match.namespace
        print(current_namespace)
        urls = reverse("%s:login" % current_namespace)
        return redirect(urls)
             
cms中views.py
        from django.shortcuts import render
        from django.http import HttpResponse
        from django.shortcuts import redirect,reverse
        def index(request):
            username = request.GET.get('username')
            if username:
                return HttpResponse("后台主页")
            else:
                # return redirect('/login/')
                current_namespace = request.resolver_match.namespace
                print(current_namespace)
                #login_url = reverse('cms:login')
                return redirect(reverse("%s:login"%current_namespace))

def login(request):
            return HttpResponse("后台登录界面")
        # Create your views here.

```

### include函数

```
include(moudule,namespace=None)
* moudule 子url的模块  比如 cms.urls   
* namespace 给每个实例起个名字

如果说 你在主目录下面的path 里边写了namespace 实例命名空间 但是 没有写 应用命名空间 app_name   
会报错

两种写法
在应用命名空间app_name设置的情况下   一些两种均可使用
path('book/',include('book.urls',namespace='book')),
path('book/',include('book.urls','book')),
```

### re_path

> re_path 跟 path 作用一样    不同的是 re_path 写url的时候 可以使用正则表达式   功能更强大  
>
> 写正则表达式的时候 推荐使用原声字符串    
> 如果re_path 正则表达式定义变量  用 ()包裹起来  看成一个分组  
>
> 参数有名字  前面需要加 ?P  ?P<参数名字 >后面跟正则表达式规则
>
>

```
urlpatterns = [
    #r'' 表示原生字符串 python正则表达式中  加上r
    re_path(r'^$',views.article),
    #http://127.0.0.1/article/list/year
    #在python中参数有名字 那么需要使用?P<参数名字>
    re_path(r'^list/(?P<year>2\d{3})/$',views.article_list),
    re_path(r'^list/(?P<month>\d{2})/$',views.article_list_month),
]
```

**如果不是特殊要求 (不得不使用正则表达式来解决 ) 能用path 就是用path  re_path 容易把代码弄复杂  **

### reverse 补充

```
如果在reverse url的时候 需要添加参数(鼠标放到reverse上 CTRL+点击)  可以添加 kwargs 参数  到reverse 中  示例代码  
def index(request):
    username = request.GET.get('username')
    if username:
        return HttpResponse("首页")
    else:
        #login_url = reverse('login')
        #打开首页 自动跳转到 http://127.0.0.1/detail/10/20
        #detail_url = reverse('detail',kwargs={"book_id":10,"page":20})
        #想要打开首页自动跳转到 http://127.0.0.1/login/?next=
        #return redirect(detail_url)
        #login_url = reverse('login',kwargs={"?next=":"haha"})#会报错  不支持这种写法
         login_url = reverse('login')+"?next=/"#支持这种方法

return redirect(login_url)

def login(request):
    return HttpResponse("登录页")
# Create your views here.

def book_detail(request,book_id,page):
    text = "您的图书id是:%s" % book_id
    return HttpResponse(text)
    
    
如果需要添加 查询字符串的参数  比如 打开首页 http://127.0.0.1:9000 自动跳转到 http://127.0.0.1:9000/?next=/

这个时候  kwargs 参数不生效   只能  
 login_url = reverse('login')+"?next=/"  这种形式

--------------------------------------------------------

views.py
      from django.shortcuts import render
      from django.http import HttpResponse
      from django.shortcuts import redirect,reverse
      def index(request):
          username = request.GET.get('username')
          if username:
              return HttpResponse('首页')
          else:
              # login_url = reverse('login')
              #打开首页自动跳转http://127.0.0.1:8000/detail/12/12/
              # detail_url = reverse('detail',kwargs={"book_id":12,"page":12})
              # return redirect(detail_url)
             #想要打开首页自动跳转http://127.0.0.1:8000/login/?next=
              #+号拼接字符串
              login_url = reverse('login')+"?next=/"
              return redirect(login_url)
      def login(request):
          return HttpResponse("登录界面")
      def book_detail(request,book_id,page):
          text = "您的图书id为:%s" % book_id
          return HttpResponse(text)
      # Create your views here.
      ---------------------------------------------
项目url.py
      from django.urls import path
      from book import views
      urlpatterns = [
          path('',views.index,name='index'),
          path('login/',views.login,name='login'),
          path('detail/<book_id>/<page>/',views.book_detail,name='detail')
      ]

```

## url 默认参数

```
打开糗事百科  默认查看第一页内容   用户可以选择其它页面 
在使用 path 或者 re_path的时候  通过传递参数 打开首页 http://127.0.0.1:9000 显示默认内容

from django.urls import path
from . import views

urlpatterns = [
    #path('admin/', admin.site.urls),
    path('',views.benshan),
    path('page/<int:page>/',views.benshan)
]

from django.http import HttpResponse
dongbeiF4 = [
    '尼古拉斯赵四',
    '刘能',
    '宋小宝',
    '小沈阳'

]
# def index(request):
#     return HttpResponse(dongbeiF4[0])

def benshan(request,page=0):
    return HttpResponse(dongbeiF4[page])
```

## 前后端界面

~~~
前端front
views.py:
    from django.shortcuts import render
    from django.http import HttpResponse
    from django.shortcuts import redirect,reverse
    def index(request):
        username = request.GET.get('username')
        if username:
            return HttpResponse("前端首页")
        else:
            # return redirect('/login/')
            login_url = reverse('front:login')
            print(login_url)
            return redirect(login_url)

def login(request):
        return HttpResponse('前端登录界面')
          # Create your views here.
--------------------------------------------------

urls.py
      from django.urls import path
      from . import views
      app_name='front'
      urlpatterns = [
             path('',views.index,name='index'),
              path('signup/',views.login,name='login')
      ]
----------------------------------------------------
后端cms
views.py
    from django.shortcuts import render
    from django.http import HttpResponse
    from django.shortcuts import redirect,reverse
    def index(request):
        username = request.GET.get('username')
        if username:
            return HttpResponse("后端首页")
        else:
            # return redirect('/login/')
            login_url = reverse('cms:login')
            print(login_url)
            return redirect(login_url)

def login(request):
        return HttpResponse('后端登录界面')
    # Create your views here.
----------------------------------------------------
urls.py
    from django.urls import path
    from . import views
    app_name = 'cms'
    urlpatterns = [
        path('',views.index,name='index'),
        path('signin/',views.login,name='login')
    ]
-----------------------------------------------------
项目的urls.py
      urlpatterns = [
          path('',include('front.urls')),
          path('cms/',include('cms.urls')),
      ]

~~~

django -- url映射相关推荐

  1. Django从理论到实战(part7)--关于视图函数与URL映射

    学习笔记,仅供参考 参考自:Django打造大型企业官网:URL映射 本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列中,尽 ...

  2. 使用Python Django开发web应用5 URL映射、模板和视图

    版本声明:转载请注明出处.未经允许,禁止商业用途. 使用Python Django开发web应用5 URL映射.模板和视图 ----刘一凡 创建模板 在D:\django\web\blog\中创建te ...

  3. Django URL

    一.创建Django项目: 用命令行创建: 创建项目:在终端通过命令:django-admin startproject [项目名称] 即可创建,比如:django-admin startprojec ...

  4. url映射 ccf (Java正则表达式80分解法)

    问题描述 试题编号: 201803-3 试题名称: URL映射 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 URL 映射是诸如 Django.Ruby on Rails 等 ...

  5. django url 生效_Django基础知识

    最近开始看Django框架,对我来说时间一长必定会忘记,所以还是做做笔记!学Django之前还看了点关于Web框架的原理什么的...杂七杂八!!! 0x00 关于Web服务 A. Web间的通信 We ...

  6. DJango — URL的Reverse和Resolve

    DJango系列的上一篇我们讲到了它是怎么解析和匹配URL的,并从URL中提取一些有用的信息(曾以year和month为例);但是,URL的管理仍然是一个巨大的工程,我们不得不维护数量庞大的patte ...

  7. CCF201803-3 URL映射(100分)【文本处理+暴力】

    试题编号: 201803-3 试题名称: URL映射 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 URL 映射是诸如 Django.Ruby on Rails 等网页框架 ...

  8. CCF系列题解--2018年3月第三题 URL映射

    问题描述 URL 映射是诸如 Django.Ruby on Rails 等网页框架 (web frameworks) 的一个重要组件.对于从浏览器发来的 HTTP 请求,URL 映射模块会解析请求中的 ...

  9. CCF 201803 跳一跳 碰撞的小球 url映射 棋局评估

    试题编号: 201803-1 试题名称: 跳一跳 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 近来,跳一跳这款小游戏风靡全国,受到不少玩家的喜爱. 简化后的跳一跳规则如下: ...

最新文章

  1. iOS--SDAutolayout宽度自适应
  2. 2016/01/13开始学习git:分支管理:Bug分支
  3. Windows7下Caffe-SSD的应用(一)——在Windosw7下编译配置Caffe-SSD CPU版本
  4. Linux系统调用的运行过程【转】
  5. oracle 存储 更新,oracle 更新空间数据存储过程语句
  6. 为什么安装了Microsoft .NET Framework 4之后我的电脑网卡启动会变得很慢很慢。。...
  7. 当c语言老师遇到网络崩溃,网络教学搞不定?工科教授来支招!
  8. 计算机等级考试在校生变成社会考生,关于开展2021年9月份全国计算机等级考试(NCRE)报名工作通知...
  9. 35岁以后,被社会无情抛弃,放下面子赚钱
  10. RocketMQ开发指导之一——RocketMQ简介
  11. 中秋前小假期的一些想法
  12. DSP28335笔记——系统时钟 和 GPIO
  13. window10 时间同步出错 超时
  14. AssertionError: Torch not compiled with CUDA enabled
  15. 项目管理体制改革的经验和成效(转)
  16. CCS7.2中如何切换烧写RAM和Flash版本程序
  17. 站长付个人支付收款平台如何收费?
  18. 微信小程序 家校通 中小学家校联系电子作业系统
  19. java不能连接mysql_java无法连接数据库问题(急)
  20. 关于旋转中心的计算以及运用

热门文章

  1. 海思SDK学习(5)海思媒体处理软件平台MMP(4)VO视频输出
  2. Fragment already added问题的解决
  3. 易快报创始人兼CEO马春荃:数智化时代扑面而来,多维度重构企业财智领域
  4. dwg怎么转换成html,web html页面显示autocad等dwg格式图形文件方法
  5. MATLAB2016笔记(七):数据分析
  6. CSP 2018-9-4 再卖菜 搜索 + 剪枝
  7. 如何把二维码引入固定资产管理?
  8. Relative Orientation 与fundamental essential matrix
  9. 小小丁出生——有图有真相
  10. uniapp nvue运用map组件实现地图标注以及检索周边地址