热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

03.Django框架之路由层,本地虚拟环境搭建

路由层路由即请求地址与视图函数的映射关系,如果把网站比喻成一本书,那路由就是这本书的目录,在django中默认把路由配置在urls.py中路由配置#urls.pyfro

路由层

路由即请求地址与视图函数的映射关系,如果把网站比喻成一本书,那路由就是这本书的目录,在django中默认把路由配置在urls.py中

路由配置

# urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r\'^admin/\', admin.site.urls),
    url(r^test/[0-9]{4})/$,views.test  # 数字组加量字的组合(限制四位数)
    url(r\'^test/(\d+)/$\',views.test),  # 无名分组:数字贪婪匹配
    url(r\'^testadd/(?P\d+)/$\',views.testadd), # 有名分组
    url(r\'^test2/(\d+)/(\d+)/$\',views.test2),  # 无名分组多个
    url(r\'^test2/(?P\d+)/(?P\d+)/$\',views.test2)   # 有名分组多个
]

路由的简单配置示例

#urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views  # 导入模块views.py
"""
由一条条映射关系组成的urlpatterns列表称之为路由表
url()方法
^xxxx/$ :第一个参数其实是正则表达式,用来匹配url地址的路径部分
view.xxxx :一旦第一个参数匹配到了内容则直接结束匹配,执行对应的视图函数,
		   来处理业务逻辑
"""

urlpatterns= [
    url(r\'^admin/\',admin.site.urls),
    # 写我们自己的路由与视图函数对应关系
    url(r\'^index/$\',views.index) # 新增一条
]


#views.py
from django.shortcuts import render,HttpResponse

def index(request):
    return HttpResponse(\'holle word\')

# settings.py

# APPEND_SLASH = False   # 控制是否加斜杠再次请求 
# 改参数默认就是True  一般情况下无需修改

注意:用上面这个示例运行djongo项目,在浏览器中输入http://127.0.01:8080/index/会看到hello word,因为r\'^index/$\'正则表达式匹配成功了,但是在浏览器中输入http://127.0.01:8080/index,理应不会匹配成功任何正则表达式,但是还是会看到hello word因为在配置文件settings.py中有一个默认参数APPEND_SLASH,该参数有两个值(True或False,如果没有设置就默认为True),当为True时 ,Django会在路径后面自动加上/,再去匹配\

路由匹配规律

先不加/匹配一次,如果匹配不上,浏览器进行重定向,自动加一个/再匹配一次,如果还匹配不上就会报错

无名分组:

执行视图函数的时候会将分组(括号)内正则表达式匹配到的内容当做位置参数传递给对应的视图函数,视图函数加一个形参接收,再通过reverse进行反向解析得完整的请求地址,这样就可以知道用户访问的是什么资源,进行针对性返回

# 路由urls.py
url(r\'^test/\d+/$\',views.test)
# 正则表达式分组:给正则表达式前后加一个小括号
url(r\'^test/(\d+)/$\',views.test)

# 视图views.py
def test(request,xxx):
    print(xxx)
    return HttpResponse(\'from test\')

有名分组

执行视图函数的时候会将分组(括号)内正则表达式匹配到的内容当做关键字参数传递给对应的视图函数

# 路由
url(r\'^testadd/(?P\d+)/$\',views.testadd)  # 给正则表达式起个别名

# 视图
def test(request,id):
    print(id)
    return HttpResponse(\'from testadd\')

是否可以结合使用

利用有名分组和无名分组 我们就可以在调用视图函数之前给函数传递额外的参数

注意:无名分组和有名分组不能混合使用

但是同一种分组的情况下可以使用多次,
无名可以有多个

有名可以有多个

# 第一个是无名,第二个是有名
url(r\'^test1/(\d+)/(?P\d+)/$\',views.test1) # 报错,不能混用

# 可以无名分组多个使用
url(r\'^test2/(\d+)/(\d+)/$\',views.test2),
# 可以有名分组多个使用
url(r\'^test2/(?P\d+)/(?P\d+)/$\',views.test2)

反向解析

当路由频繁变化的时候,html界面上的连接地址如何做到动态解析?

根据自己设置的一个别名,动态解析出一个结果,该结果可以直接访问对应的url

1.给路由与视图函数对应关系添加一个别名(名字自己指定 只要不冲突即可)
# 路由	
    url(r\'^index/\',views.index,name=\'index_name\')
     
2.根据该别名动态解析出一个结果,该结果可以直接访问到对应的路由
# 前端模板文件中使用
    "{% url \'index_name\' %}">111
    
# 后端视图函数中使用
from django.shortcuts import reverse # 需要导一个反向解析模块
reverse(\'index_name\')
	ps:redirect括号内也可以直接写别名

无名分组反向解析

当路由出现无名有名分组反向解析需要传递额外的参数

# 路由
	url(r\'^index/(\d+)/\',views.index,name=\'index_name\') 
    
# 前端模板文件中使用
	"{% url \'index_name\' 1 %}">  # 只要给个数字即可
    
# 后端视图函数中使用
	reverse(\'index_name\',args=(1,))  # 只要给个数字即可

有名分组反向解析

# 路由
	url(r\'^index/(?P\d+)/\',views.index,name=\'index_name\')
    
# 前端模板文件中使用
	"{% url \'index_name\' id=666 %}">  # 只要给个数字即可
   
# 后端视图函数中使用
	reverse(\'index_name\',kwargs={\'id\':123})  # 只要给个数字即可

总结

​ 针对无名分组有名分组都可以使用一种(无名)反向解析的形式

​ 反向解析的本质: 就是获取到一个能够访问名字所对应的视图函数

路由分发

简介

​ django是专注于开发应用的,当一个django项目特别庞大的时候,所有的路由与视图函数映射关系全部写在项目名下urls.py(总路由层),很明显太冗余也不便于管理

其实在django中的每一个(app)应用都可以有自己独立的urls.py路由层,static文件夹,templates文件夹。

基于上述特点,使用django做分组开发非常的简便。每个人只需要写自己的应用即可,互不干扰。最后由组长统一汇总到一个空的django项目中然后使用路由分发将多个应用关联到一起,即可完成大项目的拼接

  • 路由分发解决的就是项目的总路由匹配关系过多的情况
  • 使用路由分发 会将总路由不再做匹配的活
  • 而仅仅是做任务分发(请求来了之后 总路由不做对应关系 只询问你要访问哪个app的功能 然后将请求转发给对应的app去处理 )

1.路由分发,复杂版本

# 需要导入一个include模块
from django.conf.urls import url,include 

# 导入子路由的uls
from app01 import urls as app01_urls
from app02 import urls as app02_urls

# 路由分发,复杂版本
url(r\'^app01/\',include(app01_urls))
url(r\'^app02/\',include(app02_urls))
\'\'\'总路由最后千万不能加$\'\'\'

2.路由分发,进阶版本

from django.conf.urls import url,include

url(r\'^app01/\',include(\'app01.urls\')),
url(r\'^app02/\',include(\'app02.urls\'))
\'\'\'总路由最后千万不能加$\'\'\'
# app01.urls就相当于于from app01 import urls as app01_urls

名称空间

"""
当多个应用在反向解析的时候如果出现了别名冲突的情况,那么无法自动识别
"""
解决方式1>>>:名称空间
    总路由
	 url(r\'^app01/\',include(\'app01.urls\',namespace=\'app01\'))
         url(r\'^app02/\',include(\'app02.urls\',namespace=\'app02\'))
    
         reverse(\'app01:index_name\')
         reverse(\'app02:index_name\')
    
         "{% url \'app01:index_name\' %}">app01
	 "{% url \'app02:index_name\' %}">app02
        
解决方式2>>>:别名不能冲突(加上自己应用名作为前缀)
    url(r\'^index/\',views.index,name=\'app01_index_name\')
    url(r\'^index/\',views.index,name=\'app02_index_name\')

伪静态

原来是动态页面/login 做成/login.html

将url地址模拟成html结尾的样子,看上去像是一个静态文件

目的是为了增加搜索引擎收藏我们网站的概率以及seo查询几率

ps:再怎么优化都不如RMB玩家!!!

本地虚拟环境

在实际的开发过程中,我们会给不同的项目配备不同的环境,项目用到什么就装什,用不到的一概不装,不同的项目解释器环境都不一样

  • 创建虚拟环境类似于你重新下载了一个纯净的python解释器
  • 如果反复创建类似于反复下载,会消耗一定的硬盘空间
    ps:我们目前不推荐你使用虚拟环境,所有的模块统一全部下载到本地

了解知识:项目依赖 requirements.txt

python语言算是比较早提出包管理概念的, 使用pip安装依赖的确是非常方便. 对于一些简单的脚本或爬虫, 我们一般直接使用
系统python环境安装相关依赖. 稍微大一点的项目, 比如使用了Django, 那么所需要的依赖就非常多, 这个时候使用venv隔离
环境就非常好(建议python项目多使用venv环境). 但我们的问题是, 当我们将项目移到另一个环境中时, 这些依赖怎么安装, 
还是一个一个去对比执行? 
解决方法:
1. 导出原项目的依赖
pip freeze > requirements.txt

2. 在新项目中一次性安装依赖
pip install -r requirements.txt

在pycharm窗口选择file----->settings

选择Project Interpreter----->设置按钮选择Add
image-20210401175142964
根据自身需求进行选项,最好将虚拟环境放在指定的文件夹内,方便后面的项目使用
image-20210401175700828
在虚拟环境下创建新的django项目需要注意的:
image-20210401181408288

django版本区别

复制django1.X与2.X、3.X之间路由的区别

urls.py中的路由匹配方法:
    1.X第一个参数正则表达式
        url()
    2.X和3.X第一个参数不支持正则表达式,写什么就匹配什么,100%精准匹配
        path()
    如果想要使用正则,那么2.X与3.X也有响应的方法
        from django.urls import path,re_path
        re_path 等价于 1.X里面的url方法
 
虽然django1.X与2.X里面的path不支持正则表达式,但是它提供五个默认的转换器

   str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
   int,匹配正整数,包含0。
   slug,匹配字母、数字以及横杠、下划线组成的字符串。
   uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
   path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
    
自定义转换器(了解):
class MonthConverter:
    regex=\'\d{2}\' # 属性名必须为regex

    def to_python(self, value):
        return int(value)
    
    def to_url(self, value):
        return value # 匹配的regex是两个数字,返回的结果也必须是两个数字
        
from django.urls import path,register_converter
from app01.path_converts import MonthConverter

register_converter(MonthConverter,\'mon\')

from app01 import views

urlpatterns = [
        path(\'articles////\', views.article_detail, name=\'aaa\'),
]

推荐阅读
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • 在开发app时,使用了butterknife后,在androidStudio打包apk时可能会遇到报错。为了解决这个问题,可以通过打开proguard-rules.pro文件进行代码混淆来解决。本文介绍了具体的混淆代码和方法。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
author-avatar
王素维060615
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有