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


路由层

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

"{% 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 '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
"{% 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'),
]