Django--路由系统
之前通过django写了一个简单地学生管理系统,将所有的业务逻辑都写在了urls.py文件中,这样虽然使得逻辑简单明了,但是存在诸多问题
- 业务逻辑混乱,不同子项目都放在了一起
- 当接口变得很多时,会使得urls.py文件很乱
- 违反了高内聚低耦合的原则
所以我们就需要对一个大项目进行区分,划分为一个个小的项目,即创建一个个app
创建app
第一步:创建app
- 使用pycharm创建,在新建django项目的时候,创建app,但此时只能创建一个app
- 通过命令行进行创建app,
python manage.py startapp app名字
,这是可以创建多个app的
第二步:settings配置
当我们通过pycharm进行创建app的时候,在生成django项目的时候,会自动在settings.py中生成配置,但如果通过命令行进行创建项目,就需要在settings.py文件中进行配置
# settings.py INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config', # 通过pycharm创建app自动生成 'classes', # 命令行创建app,不会自动生成,需要手动添加,直接写app的名字就可以了 ]
路由的分组
第一种:将业务逻辑写在app中的views.py文件中,通过模块导入到urls.py中
# urls.py: from app01 import views urlpatterns = [ url(r'^test/', views.test), ]
# views.py from django.shortcuts import render,HttpResponse,redirect def test(request): return HttpResponse('ok')
第二种:使用include来进行app分组
# urls.py: from django.conf.urls import url, include urlpatterns = [ url(r'^classes/', include("classes.urls")), url(r'^staudent/', include("staudent.urls")), url(r'^teachers/', include("teachers.urls")), ]
在classes这个app中,添加你urls.py文件
# classes.urls.py from django.conf.urls import url from classes import views urlpatterns = [ url(r'^get_classes/', views.get_classes), url(r'^get_class/', views.GetClass.as_views()), ]
在classes的app中views.py中添加业务逻辑
# classes.views.py from django.shortcuts import render,HttpResponse # FBV方式 def get_classes(request): if request.method == 'GET': return HttpResponse('get') else: return HttpResponse('post') # CBV方式 class GetClass(request): def get(self,request): return HttpResponse('get') def post(self,request): return HttpResponse('post')
路由的分发
django中的路由分发本质就是正则表达式匹配
# urls.py
urlpatterns = [
# 匹配以get_classes/开头
url(r'^get_classes/', views.get_classes),
# 匹配以get_classes/开头,get_classes/结尾
url(r'^get_classes/$', views.get_classes),
# 获取括号里面的值,比如test/abc/qwe123/这个url,会获取到abc、qwe123这两个值
url(r'^test/(\w+)/(\w+)/', views.test),
# 也是获取括号里面的值,但此时获取的值会带上名字,如id-->abc,name-->qwe123
url(r'^test1/(?P<id>\w+)/(?P<name>\w+)/', views.test1),
]
# views.py
def test(request,name,id):
print(name) # abc
print(id) # qwe123
return HttpResponse('test')
def test1(request,name,id):
print(name) # qwe123
print(id) # abc
return HttpResponse('test1')
注意:
- 没有?P约束,传参的时候,会根据顺序来获取参数对应的值
- 有?P约束的话, 传参的时候, 会固定的将获取的值传给所对应的的约束
反向路由解析
在使用Django 项目时,一个常见的需求是获得URL 的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。人们强烈希望不要硬编码这些URL(费力、不可扩展且容易产生错误)或者设计一种与URLconf 毫不相关的专门的URL 生成机制,因为这样容易导致一定程度上产生过期的URL。
此时我们就需要给url起一个别名
# urls.py
urlpatterns = [
url(r'^get_classes/', views.get_classes, name = 'class'),
]
<form action="{% url "class" %}" method="post">
<input type="text">
</form>