首页 > 其他分享 >django 路由相关

django 路由相关

时间:2024-09-09 17:14:48浏览次数:1  
标签:None name views django api path 相关 login 路由

路由系统

1 常见操作

通俗的语言来表示:URL -> 函数对应关系

image-20230702155130852

2 路由源码分析

2.1 路由定义的本质

image-20230702184759240

from django.urls import path, re_path
from apps.www import views

from django.urls import URLPattern
from django.urls.resolvers import RoutePattern

urlpatterns = [

    URLPattern(RoutePattern("login/", name=None, is_endpoint=True), views.login, None, None),
    path('login/', views.login, name='n1'),

    # http://127.0.0.1:8000/info/2222/
    # http://127.0.0.1:8000/info/2222/?a1=1&b1=2
    # path('info/<int:v1>/', views.info),

    # http://127.0.0.1:8000/other/11/wupeiqi/
    # http://127.0.0.1:8000/other/222/alex/
    # path('other/<int:v1>/<str:v2>/', views.other),

    # path('xx/<path:v2>/', views.xx),
    # path('xx/<uuid:v2>/', views.xx),

    # http://127.0.0.1:8000/yy/2014-11-11
    # re_path(r'yy/(\d{4})-(\d{2})-(\d{2})/', views.yy),
]
  • 编写路由

  • 启动项目时

    urlpatterns = [
    	对象(URL地址、函数),
    	对象(URL地址、函数),
    	对象,
    	对象,
    	对象,
    	URLPattern(RoutePattern("login/", name=None, is_endpoint=True), views.login, None, None),
    ]
    
    # 内部路由匹配的时,默认执行:
    URLPattern.resolve
        self.pattern.match()
        return ResolverMatch(...)
        
    # 进阶操作
    # 路由系统中的扩展点:
    	URLPattern.resolve
    	RoutePattern.match
    	自定义ResolverMatch类
    
  • 用户浏览器访问

    http://127.0.0.1:8000/login/
    
  • django的源码内部,一定会匹配,获得相应的视图函数

    http://127.0.0.1:8000 /login/
    
    urlpatterns = [
    	对象(URL地址、函数),
    	对象(URL地址、函数),
    	对象,
    	对象,
    	对象
    ]
    
    urlconf = 'day006.urls'
    resolver = URLResolver(RegexPattern(r"^/"), urlconf)
    
    resolver_match = resolver.resolve(request.path_info)
    
    callback, callback_args, callback_kwargs = resolver_match
    
  • 执行视图函数

    urlpatterns = [
        path('login/', views.login),
        path('info/<int:v1>/', views.info),
    ]
    
    urlpatterns = [
        URLPattern(RoutePattern("login/", name=None, is_endpoint=True), views.login, None, None),
        URLPattern(RoutePattern("login/", name=None, is_endpoint=True), views.login, None, None),
        URLPattern(RoutePattern("login/", name=None, is_endpoint=True), views.login, None, None),
        URLPattern(RoutePattern("login/", name=None, is_endpoint=True), views.login, None, None),
    ]
    
  • 源码内部路由匹配的时,是怎么做的?

    URLPattern.resolve
    	RoutePattern.match
    
    def resolve(self, path):
        match = self.pattern.match(path)
        if match:
            new_path, args, captured_kwargs = match
            # Pass any default args as **kwargs.
            kwargs = {**captured_kwargs, **self.default_args}
            return ResolverMatch(
                self.callback,
                args,
                kwargs,
                self.pattern.name,
                route=str(self.pattern),
                captured_kwargs=captured_kwargs,
                extra_kwargs=self.default_args,
            )
    
    
    
        def match(self, path):
            match = self.regex.search(path)
            if match:
                # RoutePattern doesn't allow non-named groups so args are ignored.
                kwargs = match.groupdict()
                for key, value in kwargs.items():
                    converter = self.converters[key]
                    try:
                        kwargs[key] = converter.to_python(value)
                    except ValueError:
                        return None
                return path[match.end() :], (), kwargs
            return None
    
    

2.3 name别名

path('login/', views.login, name='n1'),
URLPattern(RoutePattern("login/", name="n1", is_endpoint=True), views.login, None, "n1"),
def login(request):
    return HttpResponse("欢迎登陆")
from django.urls import reverse

result = reverse("n1")
print(result) # "login/"
path('api/auth/login/<int:v1>/', views.login, name='n1'),
def login(request,v1):
    return HttpResponse("欢迎登陆")
from django.urls import reverse

result = reverse("n1",kwargs={"v1":123})
print(result) # "/api/auth/login/123/"

result = reverse("n1",kwargs={"v1":999})
print(result) # "/api/auth/login/999/"

name存在的意义?例如:用户登录登录程序

/api/auth/login/         ->   函数登录
/api/user/account/      ->    函数账单
path('api/auth/login/',  views.login,  name='n1'),
path('api/user/account/', views.account, name='n2'),
def login(request):
    # 当用户登录成功之后,需要让用户跳转到 /api/user/account/ 页面
    # return redirect("/api/user/account/")
    
	# url = reverse("n2")   # "/api/user/account/"
    # return redirect(url)

	return redirect("n2")
    
def account(request):
    return HttpResponse("用户信息")

name存在的意义?例如:权限管理

A用户有权访问的网址:
	/api/auth/login/ 
	/api/user/account/
	/api/user/order/
	/api/user/order/<int:v1>/
	
B用户有权访问的网址:
	/api/user/account/
	/api/user/order/
	/api/user/order/<int:v1>/
A用户有权访问的网址:
	n1
	n2
	n3
	
B用户有权访问的网址:
	n2
	n3

标签:None,name,views,django,api,path,相关,login,路由
From: https://www.cnblogs.com/sherwin1995/p/18404907

相关文章

  • windows和Linux上安装nvm及相关配置
    Windows安装:1、详情参考:https://blog.csdn.net/goods_yao/article/details/137854626本文详细介绍了在Windows系统中使用nvm(NodeVersionManager)管理Node.js版本的过程,包括卸载Node.js、nvm的安装与配置、修改npm镜像源、环境变量设置及常见问题解决。 Linux(centos7.6)安装:0、机......
  • 关于用户和用户组的相关命令
    以下命令均是在超级用户(root)下运行的:假设有个普通用户(life)1.期望将他加入到一个新的用户组(group1):​ 目标用户组不存在,可以先创建该组,使用groupadd命令:groupaddgroup1​ 将用户(life)添加到用户组(group1)usermod-aGgroup1life​ 参数的解释:​ -a参数(--append)作......
  • django环境相关
    1.项目相关新项目开发时,可能遇到使用其他的版本。虚拟环境老项目打开项目虚拟环境1.1关于新项目1.系统解释器+命令行【学习】C:/python38 -python.exe -Scripts -pip.exe -pip3.8.exe -django-admin.exe -Lib -re.py -site-pakages -d......
  • django 纯净版项目
    1.纯净版项目django内置有100个功能,5个功能是项目使用概率比较大。创建Django项目时,默认配置上功能。创建Django项目时,默认配置剔除。Django纯净和Flask等轻量级框架的对比:Flask,一个py文件项目,基于蓝图项目创建结构化。Django,默认的配置,剔除好几个文件。a.创建项目E:......
  • 安装部署tidb中的安装tidb-4000组件失败相关问题(环境为统信20操作系统
    1.安装时发现安装时间很久,停止之后报错,查看日志发现报错如下[2024/09/0914:08:52.509+08:00][FATAL][terror.go:309]["unexpectederror"][error="othererror:[components/tidb_query_datatype/src/expr/ctx.rs:89]:evaluationfailed:unknownorincorrecttimezon......
  • 性能评估工具Profiler的使用与相关介绍
    性能评估工具Profiler经历三天的性能评估工具探索,终于找到了正确使用Profiler的正确使用方法。环境搭建#python环境搭建(python=3.10)condacreate--prefix=/path/to/you/env/namepython=3.10#torch环境搭建(CUDA12.1,linux,pip)pip3installtorchtorchvisiontorchaudio#......
  • Vue3学习汇总(路由篇)
    1.单一页面设计常用存在导航栏和内容区,导航栏路由分配,内容区呈现组件内容;<template><divclass="app"><h2class="title">vue路由测试</h2><!--导航区--><divclass="navigate"><RouterLinkto="/h......
  • vue2+elementUI+Django实现登录注册功能
     前端代码<template><el-rowtype="flex"justify="center"style="height:100vh;"><el-col:xs="24":sm="12":md="8":lg="6"><el-cardclass="login-card......
  • 从STM32的定时器到Linux上的时间相关服务
    难题:在baremetal上实现按钮点击、长按事件起因是因为我想用stm32加几个按钮只做一个我自己的控制器,我可以通过按钮执行一些功能。硬件是如何和CPU通信的呢?CPU上支出几个GPIO引脚,这些引脚可以配置为输入模式和输出模式,并且都有两种状态——高电平和低电平。硬件连接这些引脚,你编......
  • 基于django+Python的学生选课系统的设计与实现
    前言......