Django--路由系统

Django--路由系统

之前通过django写了一个简单地学生管理系统,将所有的业务逻辑都写在了urls.py文件中,这样虽然使得逻辑简单明了,但是存在诸多问题

  1. 业务逻辑混乱,不同子项目都放在了一起
  2. 当接口变得很多时,会使得urls.py文件很乱
  3. 违反了高内聚低耦合的原则

所以我们就需要对一个大项目进行区分,划分为一个个小的项目,即创建一个个app

创建app

  • 第一步:创建app

    1. 使用pycharm创建,在新建django项目的时候,创建app,但此时只能创建一个app
    2. 通过命令行进行创建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>
原文地址:https://www.cnblogs.com/Hades123/p/11383121.html