Django——路由层

news2024/11/19 6:44:11

一. 路由匹配

1. 路由匹配注意事项

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 首页
    url(r'^$',views.home),
    # 路由匹配
    url(r'^test/$',views.test),
    url(r'^testadd/$',views.testadd),
    # 尾页(了解):  后期使用异常捕获处理, 这样的尾页让django的第二次在路径中斜杠APPEND_SLASH=True失去了意义, 第二次的重定向追加斜杠的机制等于失效了.
    url(r'',views.error),
]

'''
1. url方法第一个参数是正则表达式, 只要第一个参数正则表达式能够匹配到内容 那么就会立刻停止往下匹配, 而是直接调用对应的视图函数
2. 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^test 而不是 ^/test。
3. 每个正则表达式前面的'r' 是可选的但是建议加上。r是raw的意思标识原生字符串,声明被修饰的字符串中所有字符是普通字符。
4. 在第一次正则匹配机制没有匹配到想要的内容时,会在匹配的内容后面加一个斜杠\, 然后django内部帮你进行重定向在重头开始再匹配一次
5. 每个由正则匹配成功后所捕获的参数都作为一个普通的Python字符串传递给视图
'''

2. 取消路由匹配第一次匹配不成功,在匹配的内容后面加一个斜杠\,重定向重新匹配

# 取消自动加斜杠: 到settings.py文件中写入以下内容
APPEND_SLASH = False	# 默认是True自动加斜杠

二. 分组命名匹配

1. 无名分组

# 无名分组: 无须定义名字
    路由书写: url('^index/(\d+)', views.index)
    内部逻辑: 括号内正则表达式匹配到的内容将会当作位置参数传递给与之绑定的视图函数index
    视图函数:
        def index(request,xx):
            print(xx)
            return HttpResponse('index')

2. 有名分组

# 有名分组: 需定义名字
    路由书写: url('^index/(?P<year>\d+)', views.index)
    内部逻辑: 括号内正则表达式匹配到的内容将会当作关键字参数传递给与之绑定的视图函数index
    视图函数:
        def index(request,year):
            print(year)
            return HttpResponse('index')

3. 无名有名是否可以混合使用

# 又名无名分组不可混用, 不过可以单种多次使用.
    url('^index/(\d+)/(\d+)/', views.index)
    url('^index/(?P<year>\d+)/(?P<year>\d+)/', views.index)

    
# 多次使用如果是无名分组, 视图函数中可以使用*args接收参数
def index(request, *args):
    print(args)
    return HttpResponse('index')


# 多次使用如果是有名分组, 视图函数中可以使用**kwargs接收参数
def index(request, **kwargs):
    print(kwargs)
    return HttpResponse('index')

三. 传递额外的参数给视图函数(了解)

URLconfs 具有一个钩子,让你传递一个Python 字典作为额外的参数传递给视图函数。

django.conf.urls.url() 函数可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数。

例如:

from django.conf.urls import url
from . import views 

urlpatterns = [
    url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),
]

在这个例子中,对于/blog/2005/请求,Django 将调用views.year_archive(request, year='2005', foo='bar')。
这个技术在Syndication 框架中使用,来传递元数据和选项给视图。

四. 反向解析

反向解析也叫反向URL 匹配、反向URL 查询或者简单的URL 反查。

1. 什么是反向解析?

反向解析就是通过一些方法得到一个结果 该结果可以直接访问对应的url触发视图函数

2. 反向解析基本使用

第一步: 在urls.py中给路由与视图函数取一个别名(注意: 别名不能重复, 一定要唯一)
        url('^index/', views.index, name='xxx')
        
第二步: 使用反向解析
    在模板层使用:
        {% url 'xxx' %}
        <a href="{% url 'ooo' %}">111</a>
    在视图层使用:
        from django.shortcuts import reverse
        reverse('xxx')   

 

3. 无名有名分组反向解析

3.1 无名分组反向解析
# 路由层配置无名分组反向解析
    url(r'^index/(\d+)/',views.index,name='xxx')

# 模板层使用反向解析
    {% url 'xxx' 123 %}

# 视图层使用反向解析
    reverse('xxx', args=(1, ))

"""
路由层url分组匹配机制这个数字并不是写死的,
一般情况下放的是数据的主键值, 我们可以通过获取到的数据的主键值进而定位到数据对象,
从而可以对数据进行编辑和删除, 如下示例:
"""
# 路由层配置无名分组反向解析
    url(r'^edit/(\d+)/', views.edit, name='xxx')

# 视图层使用反向解析
    def edit(request,edit_id):
        reverse('xxx', args=(edit_id,))

# 模板层使用反向解析
    {% for user_obj in user_queryset %}
        <a href="{% url 'xxx' user_obj.id %}">编辑</a>
    {% endfor %}

3.2 有名分组反向解析
# 有名分组反向解析
   url(r'^func/(?P<year>\d+)/',views.func,name='ooo')

# 模板层使用反向解析
    第一种写法:
        <a href="{% url 'ooo' year=123 %}">111</a>
    第二种写法:  推荐
        <a href="{% url 'ooo' 123 %}">222</a>

# 视图层使用反向解析
   第一种写法:
        print(reverse('ooo',kwargs={'year':123}))
   第二种写法:
        print(reverse('ooo',args=(111,)))

四. 路由分发

'''
django的每一个应用都可以有自己的templates文件夹, urls.py文件, 以及static文件夹, 只有基于上述的这种特点, django就能够非常好的做到分组开发, 也就是说每个人只写自己的app中的功能就可以了.
因此作为组长 只需要将手下书写的app全部拷贝到一个新的django项目中 然后在配置文件里面注册所有的app再利用路由分发的特点将所有的app整合起来就可以了.

因此, 当一个django项目中的url特别多的时候, 总路由urls.py代码非常冗余不好维护这个时候也可以利用路由分发来减轻总路由的压力.

利用路由分发之后, 总路由不再干路由与视图函数的直接对应关系,而是做一个分发处理, 进而识别当前url所属的应用, 最后直接分发给对应的应用去处理就行了.
'''

总路由:

from django.conf.urls import url
from django.conf.urls import include
from django.contrib import admin


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 方式一:
    from app01 import urls as app01_urls
    from app02 import urls as app02_urls
    url(r'^app01/', include(app01_urls))  # 只要url前缀是app01开头 全部交给app01处理
    url(r'^app02/', include(app02_urls))

    # 方式二: 终极写法 推荐
    url(r'^app02/', include('app01.urls'))
    url(r'^app01/', include('app02.urls'))
]
# 注意: 总路由中不要使用`^app01/$`这种格式, 不然无法分发给子路由

子路由设置:

# app01中urls.py的配置
    from django.conf.urls import url
    from app01 import views
    urlpatterns = [
        url(r'^index/', views.index),
    ]

# app02中urls.py的配置
    from django.conf.urls import url
    from app02 import views
    urlpatterns = [
        url(r'^index/', views.index),
    ]

五. 名称空间

为什么需要名称空间?

"""
当多个应用设置了相同的别名, 使用反向解析时, 如果经过路由匹配规则匹配之后结果一样,
就会出现后面的覆盖前面的, 如果你是想触发的是前面的视图函数, 那么将访问不到.

正常情况下的反向解析是没有办法自动识别前缀的.
注意!!!: 这里说的是正常情况下, 如果反向解析所对应的url分组个数一样, 那么是可以识别的. 
"""

总路由中配置名称空间:

from django.conf.urls import url
from django.conf.urls import include
urlpatterns = [
    url('^app01/', include('app01.urls', namespace='app01')),
    url('^app02/', include('app02.urls', namespace='app02')),
]

子路由中匹配规则与别名相同:

# app01中urls.py的配置
    from django.conf.urls import url
    from app01 import views
    urlpatterns = [
        url('^reg/', views.reg, name='reg'),
    ]

# app02中urls.py的配置
    from django.conf.urls import url
    from app02 import views
    urlpatterns = [
        url('^reg/', views.reg, name='reg'),
    ]

子路使用反向解析:

# 视图层使用名称空间语法进行反向解析
    reverse('app01:reg')
    reverse('app02:reg')
    
# 模板层使用名称空间语法进行反向解析
    {% url 'app01:reg' %}
    {% url 'app02:reg' %}

补充: 其实只要保证名字不冲突 就没有必要使用名称空间

"""
一般情况下 有多个app的时候我们在起别名的时候会加上app的前缀
这样的话就能够确保多个app之间名字不冲突的问题
"""

urlpatterns = [
    url(r'^reg/',views.reg,name='app01_reg')
]
urlpatterns = [
    url(r'^reg/',views.reg,name='app02_reg')
]

六. 伪静态

# 什么是静态网页?
    静态网页数据是写死的, 万年不变的.

# 什么是伪静态?
    伪静态是将一个动态网页伪装成静态网页.
    
# 为什么要有伪静态呢?
    https://www.cnblogs.com/Dominic-Ji/p/9234099.html
    伪静态的目的在于增大本网站的SEO查询力度, 并且增加搜索引擎收藏本网上的概率.
    (SEO全称Search Engine Optimization 搜索引擎优化)

    其实, 搜索引擎本质上就是一个巨大的爬虫程序,

    总结:
        无论你怎么优化 怎么处理
        始终还是干不过RMB玩家    

路由层使用伪静态: reg.html

# 路由配置
urlpatterns = [
    url(r'^register.html', views.register),
]

# 浏览器url访问
http://127.0.0.1:8002/app01/register.html/

七. 虚拟环境

在正常开发中 我们会给每一个项目配备一个该项目独有的解释器环境
该环境内只有该项目用到的模块 用不到一概不装

linux: 缺什么才装什么

虚拟环境
    你每创建一个虚拟环境就类似于重新下载了一个纯净的python解释器
    但是虚拟环境不要创建太多,是需要消耗硬盘空间的

扩展:
    每一个项目都需要用到很多模块 并且每个模块版本可能还不一样
    那我该如何安装呢? 一个个看一个个装???

    开发当中我们会给每一个项目配备一个requirements.txt文件
    里面书写了该项目所有的模块即版本
    你只需要直接输入一条命令即可一键安装所有模块即版本

 

八. django版本区别

1. django1.X路由层使用的是url方法, 而在django2.Xhe3.X版本中路由层使用的是path方法

url() 第一个参数支持正则
path()第一个参数是不支持正则的 写什么就匹配什么

如果你习惯使用path那么也给你提供了另外一个方法
    from django.urls import path, re_path
    from django.conf.urls import url

    re_path(r'^index/',index),
    url(r'^login/',login)

提示: 2.X和3.X里面的re_path就等价于1.X里面的url

2. 虽然path不支持正则 但是它的内部支持五种转换器

path('index/<int:id>/',index)
# 将<int:id>中匹配到的内容, 先转成int类型, 再以关键字参数传递给与之绑定的index视图函数

def index(request,id):
print(id,type(id))
return HttpResponse('index')

str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int,匹配正整数,包含0。
slug,匹配字母、数字以及横杠、下划线组成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

3. 除了有默认的五个转换器之外 还支持自定义转换器(了解)

class MonthConverter:
regex='\d{2}' # 属性名必须为regex

def to_python(self, value):
    return int(value)

def to_url(self, value):
    return value # 匹配的regex是两个数字,返回的结果也必须是两个数字


from django.urls import path,register_converter
from app01.path_converts import MonthConverter

# 先注册转换器
register_converter(MonthConverter,'mon')

from app01 import views


urlpatterns = [
    path('articles/<int:year>/<mon:month>/<slug:other>/', 	views.article_detail, name='aaa'),
]

4. 模型层里面1.X外键默认都是级联更新删除的, 但是到了2.X和3.X中需要你自己手动配置参数

models.ForeignKey(to='Publish')

models.ForeignKey(on_delete=models.CASCADE, on_update=models.CASCADE)

 

补充: url中的第三个参数{}

def url(regex, view, kwargs=None, name=None)
    ...

# urls.py
    url(r'^third_params/', views.third_params, {'username': 'egon'}, name='third_params'),

# views.py
    # def third_params(request, path):     # 注意: 关键字形式传参
    def third_params(request, username):
        return HttpResponse(username)       # username返回到前端页面就是egon

九. 总结

# 路由匹配
    1. urls.py中url方法第一个参数是正则
    2. Django默认帮你开启了第一次匹配不成功, 往匹配效验的路径末尾追加一个斜杠/, 再进行重定向重新遍历循环匹配一次
        配置: 默认settings.py中没有需要自己添加
        APPEND_SLASH = False/True
    3. 定义首页url匹配规则: url('^$', views.home)
    4. 定义尾页url匹配规则: url('', views.error)
        提示: 尾页一般不使用这种方式, 这种方式会让jango的默认APPEND_SLASH机制失效
        之后我们可以使用异常处理, 来作为尾页内容.

# 分组
    # 无名分组: 无须定义名字
        路由书写: url('^index/(\d+)', views.index)
        内部逻辑: 括号内正则表达式匹配到的内容将会当作位置参数传递给与之绑定的视图函数index
        视图函数:
            def index(request, xxx):
                pass

    # 有名分组: 需定义名字
        路由书写: url('^index/(?P<year>\d+)', views.index)
        内部逻辑: 括号内正则表达式匹配到的内容将会当作关键字参数传递给与之绑定的视图函数index
        视图函数:
            def index(request, year):
                pass

    # 注意事项:
        又名无名分组不可混用, 不过可以单种多次使用.
            url('^index/(\d+)/(\d+)/', views.index)
            url('^index/(?P<year>\d+)/(?P<year>\d+)/', views.index)

        多次使用如果是无名分组, 视图函数中可以使用*args接收参数
            def index(request, *args):
                pass

        多次使用如果是有名分组, 视图函数中可以使用**kwargs接收参数
             def index(request, *kwargs):
                pass

        
# 反向解析
    # 什么是反向解析?
        反向解析就是通过一些方法得到一个结果 该结果可以直接访问对应的url触发视图函数

    # 反向解析使用
        第一步: 在urls.py中给路由与视图函数取一个别名(注意: 别名不能重复, 一定要唯一)
            url('^index/', views.index, name='xxx')

        第二部: 使用反向解析
            在模板层使用:
                {% url 'xxx' %}
                <a href="{% url 'ooo' %}">111</a>
            在视图层使用:
                from django.shortcuts import reverse
                reverse('xxx') 
                
                
# 无名有名分组反向解析
    # 无名分组反向解析
        # 路由层定义
            url(r'^index/(\d+), views.index, name='index')
        # 模板层使用:
            {% url 'index' 数字 %}
        # 视图层使用:
            from django.shortcuts import reverse
            def index(request, xxx)
                reverse('index', agrs=(xxx, )

    # 有名分组反向解析
        # 路由层定义
            url(r'^index/(?P<year>\d+), views.index, name='index')
        # 模板层使用:
            {% url 'index' year=数字 %}
            {% url 'index' 数字 %}
        # 视图层使用:
            from django.shortcuts import reverse
            def index(request, year)
                reverse('index', kwagrs=({'year': 数字})
                reverse('index', agrs=(数字, )

    # 无名有名分组反向解析使用场景
        应用: 一般用作主键值
        模板层应用: 通过给HTMl页面绑定分组反向解析, 等待用户提交时, 同时携带用户数据的主键值,
            视图层获取到不同操作反馈过来的动态主键值, models就可以基于这个主键值, 来对当前操作
            用户的其他数据进行定位.
        视图层应用: 通过反向解析进行重定向操作

    # 注意: 无名有名分组反向解析是争对单个情况的解析, 对于反向解析时的参数,
        只要是满足对于路由的正则匹配规则就行.


# 路由分发:
    # 因该分发的部分: templates, urls.py, models.py
    # 路由分发的优势: 多应用之间路由不冲突, 减轻总路由的压力及维护性差的问题, 解耦合可以更好的实现分组开发
    # 总路由设置:
        from django.conf.urls import url
        from django.conf.urls import include
        urlpatterns = [
            url(r'^admin/', admin.site.urls),
            # 方式一:
            from app01 import urls as app01_urls
            from app02 import urls as app02_urls
            url(r'^app01/', include(app01_urls))  # 只要url前缀是app01开头 全部交给app01处理
            url(r'^app02/', include(app02_urls))

            # 方式二: 终极写法 推荐
            url(r'^app02/', include('app01.urls'))
            url(r'^app01/', include('app02.urls'))
        ]
        # 注意: 总路由中不要使用`^app01/$`这种格式, 不然无法分发给子路由

    # 子路由设置:
        # app01中urls.py的配置
            from django.conf.urls import url
            from app01 import views
            urlpatterns = [
                url(r'^index/', views.index),
            ]

        # app02中urls.py的配置
            from django.conf.urls import url
            from app02 import views
            urlpatterns = [
                url(r'^index/', views.index),
            ]


# 名称空间
    # 为什么需要名称空间?
       当多个应用中的路由设置了相同的别名, 使用反向解析时,          就会出现后面的覆盖前面的, 如果你是想触发的是前面的视图函数, 那么将访问不到.

    # 总路由中配置名称空间
        from django.conf.urls import url
        from django.conf.urls import include
        urlpatterns = [
            url('^app01/', include('app01.urls', namespace='app01')),
            url('^app02/', include('app02.urls', namespace='app02')),
        ]

    # 子路由中匹配规则与别名相同
        # app01中urls.py的配置
            from django.conf.urls import url
            from app01 import views
            urlpatterns = [
                url('^reg/', views.reg, name='reg'),
            ]

        # app02中urls.py的配置
            from django.conf.urls import url
            from app02 import views
            urlpatterns = [
                url('^reg/', views.reg, name='reg'),
            ]

    # 子路由使用名称空间语法进行反向解析
        # 视图层使用名称空间语法进行反向解析
            reverse('app01:reg')
            reverse('app02:reg')

        # 模板层使用名称空间语法进行反向解析
            {% url 'app01:reg' %}
            {% url 'app02:reg' %}

    # 补充:  其实只要保证名字不冲突 就没有必要使用名称空间
        urlpatterns = [
            url('^reg/', views.reg, name='app01_reg'),
        ]
        urlpatterns = [
            url('^reg/', views.reg, name='app02_reg'),
        ]


# 伪静态
    静态网页: 网页数据写死
    伪静态: 将动态网页伪装成静态网页
    作用: 提升网站SEO查询力度, 增加收藏网页概率. -> 爬虫搜索引擎
    路由层使用伪静态:
        urlpatterns = [
            url('^reg.html/', views.reg, name='app01_reg'),
        ]

# 虚拟环境部署

# django版本区别
    1. django1.x版本路由层使用的是url方法, 而django2.x和3.x路由层使用的是path方法
        1.x版本路由匹配支持正则
        2.x和3.x版本path不支持正则, 如果想要支持正则导入re_path. 虽然保留了url方法但是不推荐使用了.

    2. django2.x和3.x版本虽然不支持正则, 但是它内部支持五种装换器
        from django.urls import path
        path('index/<int:id>', views.index)
        将<int:id>中匹配到的内容, 先转成int类型, 再以关键字参数传递给与之绑定的index视图函数

    3. 转换器支持自定义
    4. 模型层中1.x默认级联更新级联删除, 而2.x和3.x版本需要手动指定
        publish = models.ForeignKey(to='Publish', on_update=models.CASCADE, on_delete=models.CASCADE)                         

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1204577.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis解决缓存问题

目录 一、引言二、缓存三、Redis缓存四、缓存一致性1.缓存更新策略2.主动更新 五、缓存穿透六、缓存雪崩七、缓存击穿1.基于互斥锁解决具体业务2.基于逻辑过期解决具体业务 一、引言 在一些大型的网站中会有十分庞大的用户访问流量&#xff0c;而过多的用户访问对我们的MySQL数…

Linux SSH免密登录

目录 简介 创建Linux用户和用户组 配置LINUX静态IP 编辑IP映射 SSH免密登录配置 登录测试 简介 SSH&#xff08;Secure shell&#xff09;是可以在应用程序中提供安全通信的一个协议&#xff0c;通过SSH可以安全地进行网络数据传输&#xff0c;它的主要原理是利用非对称加密…

Libhybris之线程局部存储TLS实例(五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

二十三、W5100S/W5500+RP2040树莓派Pico<Web I/O 通过网页控制板载LED灯>

文章目录 1 前言2 简介2 .1 什么是Web&#xff1f;2.2 Web的优点2.3 Web数据交互原理2.4 Web应用场景 3 WIZnet以太网芯片4 HTTP网络设置示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关链接 1 前言 Web只是一个静态的文…

电源基础元件

文章目录 电源基础元件理想电压源理想电流源受控电源 电源基础元件 理想电压源 定义 其两端电压总能保持定值或一定的时间函数&#xff0c;其值与流过它的电流i无关的元件叫理想电压源 理想电压源的电压、电流关系 1.电源两端电压由电源本身决定&#xff0c;与外电路无关&…

桶装水订水送水app有哪些功能?

桶装水订水送水app是一款专为送水工量身打造的提供送水服务的软件&#xff0c;在这里&#xff0c;送水人员将更好的在线发布一些送水信息&#xff0c;在线接单等功能&#xff0c;极大的提高了工作效率&#xff0c;方便了日常生活。 系统的商户端&#xff0c;专为送水工日常送水…

【计算机网络】VRRP协议理论和配置

目录 1、VRRP虚拟路由器冗余协议 1.1、协议作用 1.2、名词解释 1.3、简介 1.4、工作原理 1.5、应用实例 2、 VRRP配置 2.1、配置命令 2.2、拓扑与配置&#xff1a; 1、VRRP虚拟路由器冗余协议 1.1、协议作用 虚拟路由冗余协议(Virtual Router Redundancy Protocol&am…

2023nacos源码解读第2集——nacos-server的启动

nacos 是一个典型的server-client中间件&#xff0c;server这里安装最新的nacos-server 2.3.0-BETA版本 1.docker启动nacos-server 镜像详情参考nacos-docker项目的readme &#xff0c;很方便&#xff0c;但是官方提供的nacos-server镜像往往可能滞后&#xff0c;且不便于后续…

【Java 进阶篇】JQuery DOM操作:舞动网页的属性魔法

在前端的舞台上&#xff0c;属性操作是我们与HTML元素进行互动的关键步骤之一。而JQuery&#xff0c;这位前端开发的巫师&#xff0c;通过简洁而强大的语法&#xff0c;为我们提供了便捷的属性操作工具。在这篇博客中&#xff0c;我们将深入研究JQuery DOM操作中的属性操作&…

C语言--1,5,10人民币若干,现在需要18元,一共有多少种?

今天小编给大家分享一下穷举法的一道典型例题 一.题目描述 1,5,10人民币若干,现在需要18元,一共有多少种? 二.思路分析 总共有18块钱&#xff0c;设1元有x张&#xff0c;5元有y张&#xff0c;10元有z张&#xff0c;则有表达式&#xff1a;x5y10z18&#xff0c;穷举法最重要的…

Unity中雾效的实现方法二

文章目录 前言一、声明雾效所需要的内置变体二、在 v2f 中声明顶点传入片段中的雾效插值器三、 在顶点着色器中计算雾效采样四、在片元着色器中进行雾效颜色混合在这里插入图片描述 五、最终效果 前言 Unity中雾效的实现方法二&#xff0c;使用 Unity 自带的方法实现&#xff…

Spring IOC - BeanDefinition解析

1. BeanDefinition的属性 BeanDefinition作为接口定义了属性的get、set方法。这些属性基本定义在其直接实现类AbstractBeanDefinition中&#xff0c;各属性的含义如下表所示&#xff1a; 类型 名称 含义 常量 SCOPE_DEFAULT 默认作用域&#xff1a;单例模式 AUT…

4.CentOS7安装MySQL5.7

CentOS7安装MySQL5.7 2023-11-13 小柴你能看到嘛 哔哩哔哩视频地址 https://www.bilibili.com/video/BV1jz4y1A7LS/?vd_source9ba3044ce322000939a31117d762b441 一.解压 tar -xvf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz1.在/usr/local解压 tar -xvf mysql-5.7.44-…

22.构造一个关于员工信息的结构体数组,存储十个员工的信息

结构体问题。构造一个关于员工信息的结构体数组&#xff0c;存储十个员工的信息&#xff0c;包括员工工号&#xff0c;员工工资&#xff0c;员工所得税&#xff0c;员工实发工资。要求工号和工资由键盘输入&#xff0c;并计算出员工所得税&#xff08;所得税工资*0.2&#xff0…

微服务概览

单体架构 传统的软件应用为单体架构。尽管也是模块化逻辑&#xff0c;但是最终还是会打包并并部署为单体应用。最主要的原因是太复杂。并且应用扩展性低&#xff0c;可靠性也低。敏捷开发和部署变得无法完成。 治理办法&#xff1a;化繁为简&#xff0c;分而治之。 微服务起源…

JavaScript从入门到精通系列第三十六篇:详解JavaScript中的事件监听和事件响应

文章目录 一&#xff1a;什么叫事件 1&#xff1a;概念 2&#xff1a;处理这个事件 (一)&#xff1a;鼠标单机按钮 (二)&#xff1a;鼠标双机按钮 (三)&#xff1a;鼠标移动 3&#xff1a;写法弊端 4&#xff1a;Dom Event 二&#xff1a;监听事件 1&#xff1a;元素事…

SpringCloud微服务:服务拆分

不同的数据库之间&#xff0c;如何共同调用&#xff1f;接下来讲讲两个数据库之间如何交互 1、微服务需要根据业务模块拆分&#xff0c;做到单一职责,不要重复开发相同业务 2、微服务可以将业务暴露为接口&#xff0c;供其它微服务使用 3、不同微服务都应该有自己独立的数据库…

中断处理机制解析

要处理中断&#xff0c;需要有一个中断处理函数。定义如下&#xff1a; irqreturn_t (*irq_handler_t)(int irq, void * dev_id);/*** enum irqreturn* IRQ_NONE interrupt was not from this device or was not handled* IRQ_HANDLED interrupt was handled by this de…

Netty实现通信框架

一、LengthFieldBasedFrameDecoder的参数解释 1、LengthFieldBasedFrameDecoder的构造方法参数 看下最多参数的构造方法 /*** Creates a new instance.** param byteOrder* the {link ByteOrder} of the length field* param maxFrameLength* the maximum len…