• 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>
    
  • 相关阅读:
    C++中virtual(虚函数)的用法
    testlins
    MATLAB——matlab特殊符号表【转载】
    VS-按F12无法跳转到函数定义,点击右键也无法跳转
    fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt
    Matlab7.1——启动时只显示Logo
    CANopen——总线基本知识
    CANopen——笔记
    ASCII表格
    Codesys——AD_DA在PID控制中的作用
  • 原文地址:https://www.cnblogs.com/Hades123/p/11383121.html
Copyright © 2020-2023  润新知