Django 路由层、本地虚拟环境搭建
路由层
路由即请求地址与视图函数的映射关系,如果把网站比喻成一本书,那路由就是这本书的目录,在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<id>\d+)/$',views.testadd), # 有名分组
url(r'^test2/(\d+)/(\d+)/$',views.test2), # 无名分组多个
url(r'^test2/(?P<id>\d+)/(?P<id1>\d+)/$',views.test2) # 有名分组多个
]
有名无名分组
# 无名分组:将括号内正则表达式匹配到的内容当作位置参数传递给后面的视图函数
path('^testnoname/(\d+)/$', views.testnoname)
# def testnoname(request, var) # var=10
# 有名分组:将括号内正则表达式匹配到的内容当作关键字参数传递给后面的视图函数
path('^testname/(?P<num>\d+)/(?P<page>\d+)/$', views.testname)
# def testname(request, page, num) # page=1 num=10
# 注:不能混用
路由分组
1.有些路由会被大量访问(直接访问、间接访问)
2.这些路由可能后期还会发生变化
3.可以给路由设置别名,通过别名访问:<a href="{% url '路由别名' '传入有名无名分组所需参数' %}"></a>
# 1.不带分组:url(r'可能会变的真实路由', 视图函数, name='路由别名')
url = reverse('路由别名')
# 2.无名分组:url(r'可能会变的真实路由(带无名分组)', 视图函数, name='路由别名')
url = reverse('路由别名', args=(给无名分组赋值))
# 3.有名分组:url(r'可能会变的真实路由(带有名分组)', 视图函数, name='路由别名')
url = reverse('路由别名', kwargs={给有名分组赋值,key就是有名分组名})
反向解析
当路由频繁变化的时候,html界面上的连接地址如何做到动态解析
# 1.给路由与视图函数对应关系添加一个别名(名字自己指定 只要不冲突即可)
url(r'^index/',views.index,name='index_name')
# 2.根据该别名动态解析出一个结果,该结果可以直接访问到对应的路由
前端
<a href="{% url 'index_name' %}">111</a>
后端
from django.shortcuts import reverse
reverse('index_name')
ps:redirect括号内也可以直接写别名
无名反向解析
# 路由
url(r'^index/(\d+)/',views.index,name='index_name')
# 后端
reverse('index_name',args=(1,)) # 只要给个数字即可
# 前端
<a href="{% url 'index_name' 1 %}"></a> # 只要给个数字即可
有名反向解析
# 路由
url(r'^index/(?P<id>\d+)/',views.index,name='index_name')
# 后端
reverse('index_name',kwargs={'id':123}) # 只要给个数字即可
# 前端
<a href="{% url 'index_name' id=666 %}"></a> # 只要给个数字即可
总结
无名有名都可以使用一种(无名)反向解析的形式
from django.shortcuts import reverse
在视图函数中通过reverse方法反向解析出真实的路径
路由分发
1.路由分发,复杂版本
# 在每一个应用中建立自身的urls.py文件,语法同主路由
# 在主路由进行分发
# 需要导入一个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.路由分发,进阶版本
# 在每一个应用中建立自身的urls.py文件,语法同主路由
# 在主路由进行分发
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>>>:名称空间
主路由:
from django.conf.urls import include
urlpatterns = [
path('^app01/', include('app01.urls', namespace='app01')),
path('^app02/', include('app02.urls', namespace='app02')),
]
app01应用下路由
from django.conf.urls import url
from app01 import views
urlpatterns = [
url('^test/', views.test, name='test')
]
app02应用下路由
from django.conf.urls import url
from app02 import views
urlpatterns = [
url('^test/', views.test, name='test')
]
前端页面反向解析:{% url 'app01:test' %} | {% url 'app02:test' %}
视图函数reverse方法:url = reverse('app01:test') | url = reverse('app02:test')
解决方式2>>>:别名不能冲突(加上自己应用名作为前缀)
url(r'^text/',views.index,name='app01_text_name')
url(r'^text/',views.index,name='app02_text_name')
由配置主页与404
路由层:
from django.urls import path, re_path
urlpatterns = [
# 主页最上方配置
re_path('^$', root, name="root"),
re_path('^index/$', index),
re_path('^home/$', home),
# 其他路由...
# 404配在最下方
re_path('/$', error)
]
视图层:
from django.shortcuts import render, redirect, reverse
# 主页
def root(request):
return render(request, 'root.html')
def index(request):
return redirect(reverse('root'))
def home(request):
return redirect(reverse('root'))
# 404
def error(request):
return render(request, 'error.html')
伪静态
动态页面:数据内容会发生变化的页面
静态页面:数据内容不会发生变化的页面
针对SEO(搜索引擎优化),静态页面更容易被搜索引擎网站收录
伪静态就是讲动态页面伪装成静态页面,容易被搜索引擎网站收录,从而增加搜索概率,提高流量
路由层:
url('^index/$', views.index),
url('^article/(?P<id>(\d+)).html/$', views.article, name='article')
视图函数层:
def index(request):
return render(request, 'index.html')
def article(request, id):
return render(request, 'article.html', {'id': id})
模板层:
index.html
<a href="{% url 'article' 1 %}">第一篇文章</a>
<a href="{% url 'article' 2 %}">第二篇文章</a>
<a href="{% url 'article' 3 %}">第三篇文章</a>
article.html
<h1>第{{ id }}篇文章</h1>
Django 2.x新特性
from django.urls import path, re_path
# 向下兼容,不建议使用url, 使用与url相同的re_path
from django.conf.urls import url
urlpatterns = [
path('index/', views.index),
# page/<int:msg>/ page/(?P<msg>(\d+)) # 访问/page/123/
# path('page/<int:msg>/', views.page),
# path('page/<str:msg>/', views.page),
# path('page/<path:msg>/', views.page),
# path('page/<slug:msg>/', views.page),
path('page/<uuid:msg>/', views.page),
]
# 1. 2.x版本re_path的使用方式同1.x版本url
# 2. path写的是绝对字符串,请求地址必须与路由地址完全匹配
# 3. path拥有五个转换器:
-- str:匹配除路径分隔符(/)外的字符串,默认
-- int:匹配自然数
-- slug:匹配字母、数字、横杠及下划线组成的字符串
-- uuid:匹配uuid形式的数据
-- path:匹配任何字符串,包括路径分隔符(/) (不能用?)
Django2.x路由分发
1.无名称空间
主路由:
path('app01/', include('app01.urls'))
子路由:
path('test/', views.test)
2.有名称空间
主路由:
path('app01/', include(('app01.urls', 'app01'))),
子路由:
path('test/', views.test, name='test')
模板层:
{% url 'app01:test' %}
本地虚拟环境
在实际的开发过程中,我们会给不同的项目配备不同的环境,项目用到什么就装什,用不到的一概不装,不同的项目解释器环境都不一样
- 创建虚拟环境类似于你重新下载了一个纯净的python解释器
- 如果反复创建类似于反复下载,会消耗一定的硬盘空间
了解知识:项目依赖 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

根据自身需求进行选项,最好将虚拟环境放在指定的文件夹内,方便后面的项目使用

在虚拟环境下创建新的django项目需要注意的

命令行安装虚拟环境(不推荐)
1.通过pip3安装虚拟环境:
-- pip3 install virtualenv
2.前往目标文件夹:
-- cd 目标文件夹 (C:\Virtualenv)
3.创建纯净虚拟环境:
-- virtualenv 虚拟环境名
了解:创建非纯净环境:
-- virtualenv-clone 本地环境 虚拟环境名
4.终端启动虚拟环境:
-- cd 虚拟环境名\Scripts
-- activate
5.进入虚拟环境下的python开发环境
-- python3
6.关闭虚拟环境:
-- deactivate
7.PyCharm的开发配置
添加:创建项目 -> Project Interpreter -> Existing interpreter -> Virtualenv Environment | System Interpreter -> 目标路径下的python.exe
删除:Setting -> Project -> Project Interpreter -> Show All
Django 测试环境搭建
ps:
1.pycharm链接数据库都需要提前下载对应的驱动
2.自带的sqlite3对日期格式数据不敏感
如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3
# 方式1:任意创建一个py文件,在该文件内书写固定的配置
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "项目名称.settings")
import django
django.setup()
# 方式2:直接使用pycharm提供的python console
Django查看原生sql
1. queryset对象.query
2. 通过日志,如下,配置到setting.py中
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}

浙公网安备 33010602011771号