Django基础七之CBV装饰器和中间件

Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475

Django基础七之CBV装饰器和中间件

目录* Django基础七之CBV装饰器和中间件
+ 1. CBV加装饰器
+ 2. Django中间件
- 2.1 Django中间件介绍
- 2.2 自定义中间件
- 2.2.1 自定义中间件
- 2.2.2 自定义中间件总结
- 2.2.3 其他中间件函数
- 2.3 新版本中间件写法
+ 3.Csrf中间件

1. CBV加装饰器

CBV加装饰器有三种方法,

案例:要求登录(不管get请求还是post请求)后才可以访问

HTML代码

index.html

html>


    
    Titletitle>

head>
<body>

<div>
    <p>Hello Indexp>
div>

body>
html>

</code></pre> 
  <p><code>login.html</code></p> 
  <pre><code>html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>
<div>
    <form action="" method="post">
        <p>username:<input type="text" name="username">p>
        <p>password:<input type="password" name="password">p>
        <p><input type="submit" value="提交">p>
    form>

div>
body>
html>

</code></pre> 
  <p><code>views.py</code></p> 
  <pre><code># CBV加装饰器方法一:
from django.shortcuts import render, HttpResponse, redirect

from django.views import View

from django.utils.decorators import method_decorator  # django提交加装饰器方法


# Create your views here.

# 装饰器
def login\_auth(func):
    def inner(request, *args, **kwargs):
        if request.session.get("is\_login"):
            res = func(*args, **kwargs)
            return res
        else:
            return redirect('/login/')

    return inner


class Index(View):
    # 方法一在每个需要验证的地方都加上装饰器
 @method\_decorator(login\_auth)
    def get(self, request):
        print("get 请求")
        return render(request, "index.html")
	# 个需要验证的地方加上装饰器
 @method\_decorator(login\_auth)
    def post(self, request):
        print("post 请求")
        return HttpResponse("post")


def login(request):
    if request.method == "POST":
        name = request.POST.get("username")
        password = request.POST.get("password")
        if name == "hans" and password == "123":
            request.session['is\_login'] = True
            print("登录成功")

    return render(request, "login.html")



# CBV加装饰器方法二:
from django.shortcuts import render, HttpResponse, redirect

from django.views import View

from django.utils.decorators import method_decorator


# Create your views here.
# 装饰器
def login\_auth(func):
    def inner(request, *args, **kwargs):
        if request.session.get("is\_login"):
            res = func(*args, **kwargs)
            return res
        else:
            return redirect('/login/')

    return inner

# 方法二 在类的上面加上,name为具体要加的函数
@method\_decorator(login\_auth, name='post')
@method\_decorator(login\_auth, name='get')
class Index(View):
    def get(self, request):
        print("get 请求")
        return render(request, "index.html")


    def post(self, request):
        print("post 请求")
        return HttpResponse("post")


def login(request):
    if request.method == "POST":
        name = request.POST.get("username")
        password = request.POST.get("password")
        if name == "hans" and password == "123":
            request.session['is\_login'] = True
            print("登录成功")

    return render(request, "login.html")


# CBV加装饰器方法三:

from django.shortcuts import render, HttpResponse, redirect

from django.views import View

from django.utils.decorators import method_decorator


# Create your views here.
# 装饰器
def login\_auth(func):
    def inner(request, *args, **kwargs):
        if request.session.get("is\_login"):
            res = func(*args, **kwargs)
            return res
        else:
            return redirect('/login/')

    return inner

class Index(View):
    #方法三 使用dispatch给所有的方法添加装饰器
 @method\_decorator(login\_auth)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

    def get(self, request):
        print("get 请求")
        return render(request, "index.html")


    def post(self, request):
        print("post 请求")
        return HttpResponse("post")


def login(request):
    if request.method == "POST":
        name = request.POST.get("username")
        password = request.POST.get("password")
        if name == "hans" and password == "123":
            request.session['is\_login'] = True
            print("登录成功")

    return render(request, "login.html")


</code></pre> 
  <p><code>urls.py</code></p> 
  <pre><code>from django.contrib import admin
from django.urls import path

from wrapperMidd  import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.Index.as_view()),
    path('login/', views.login),
]

</code></pre> 
  <p>访问地址:http://127.0.0.1:8000/index</p> 
  <p><code>get</code>的请求使用<code>POSTMAN</code>工具</p> 
  <h2>2. Django中间件</h2> 
  <h3>2.1 Django中间件介绍</h3> 
  <p>中间件是 <code>Django</code> 请求/响应处理的钩子框架。它是一个轻量级的、低级的“插件”系统,用于全局改变 <code>Django</code> 的输入或输出。</p> 
  <p>每个中间件组件负责做一些特定的功能,<code>Django</code>中自带了七个中间件</p> 
  <pre><code>MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',   # 安全中间件,为请求/响应周期提供了若干安全增强功能。每一项都可以通过设置独立地启用或禁用。
    'django.contrib.sessions.middleware.SessionMiddleware', # 启用会话支持
    'django.middleware.common.CommonMiddleware', # “通用”中间件
    'django.middleware.csrf.CsrfViewMiddleware', # CSRF 保护中间件,通过在 POST 表单中添加隐藏的表单字段,并检查请求的正确值,增加对跨站点伪造请求的保护。
    'django.contrib.auth.middleware.AuthenticationMiddleware', # 验证中间件,将代表当前登录的用户的 user 属性添加到每个传入的 HttpRequest 对象中
    'django.contrib.messages.middleware.MessageMiddleware', # 消息中间件,启用基于 cookie 和会话的消息支持
    'django.middleware.clickjacking.XFrameOptionsMiddleware', # X-Frame-Options 中间件,简单的 通过 X-Frame-Options 头的点击劫持保护。
]

</code></pre> 
  <p>中间件(<code>Middleware</code>)在整个<code>Django</code>的<code>request/response</code>处理机制中的角色如下所示:</p> 
  <blockquote> 
   <p><strong>HttpRequest -> Middleware(request) -> View -> Middleware(response) -> HttpResponse</strong></p> 
  </blockquote> 
  <p>中间件常用于权限校验、限制用户请求、打印日志、改变输出内容等多种应用场景.而且中间件对Django的输入或输出的改变是全局的。</p> 
  <p><code>Django</code> 中间件作用:</p> 
  <ul> 
   <li>修改请求,即传送到 view 中的 HttpRequest 对象。</li> 
   <li>修改响应,即 view 返回的 HttpResponse 对象。</li> 
  </ul> 
  <p>中间件执行顺序:</p> 
  <p><a href="https://img.it610.com/image/info8/5ee452848f734b2e81fcd8b2117d64ee.jpg" target="_blank"><img src="https://img.it610.com/image/info8/5ee452848f734b2e81fcd8b2117d64ee.jpg" alt="Django基础七之CBV装饰器和中间件_第1张图片" width="650" height="505" style="border:1px solid black;"></a></p> 
  <h3>2.2 自定义中间件</h3> 
  <p>中间件可以定义四个方法:</p> 
  <ul> 
   <li>process_request(self,request)</li> 
   <li>process_view(self, request, view_func, view_args, view_kwargs)</li> 
   <li>process_exception(self, request, exception)</li> 
   <li>process_response(self, request, response)</li> 
  </ul> 
  <p>主要为<code>process_request</code>和<code>process_response</code></p> 
  <h3>2.2.1 自定义中间件</h3> 
  <p>在应用目录下新建一个 py 文件,名字自定义。</p> 
  <pre><code>在应用目录下创建myMiddle.py
myMiddle.py:

from django.utils.deprecation import MiddlewareMixin

class myMinddle(MiddlewareMixin):
    def process\_request(self, request):  # 在视图之前执行
        print("这是自定义中间件 请求1")

    def process\_response(self,request, response):  #在视图之后执行
        print("这是自定义中间件 响应1")
        return response


</code></pre> 
  <p>把自定义的中间件注册到<code>setting.py</code>的 <code>MIDDLEWARE</code>里面:</p> 
  <pre><code>setting.py:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'wrapperMidd.myMinddle.myMinddle',  # 自定义中间件
]

</code></pre> 
  <p>测试:</p> 
  <pre><code>views.py:
    
from django.shortcuts import render, HttpResponse, redirect
def testMinddle(request):
    print("testMinddle")
    return HttpResponse("TEST")

urls.py:
    
from django.contrib import admin
from django.urls import path

from appName  import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('testMinddle/', views.testMinddle),
]

# 访问:http://127.0.0.1:8000/testMinddle/
# 结果:
"""
这是自定义中间件 请求1
testMinddle
这是自定义中间件 响应1
"""

</code></pre> 
  <p>增加两个自定义中间件,执行过程:</p> 
  <pre><code>myMiddle.py:

from django.utils.deprecation import MiddlewareMixin

class myMinddle(MiddlewareMixin):
    def process\_request(self, request):
        print("这是自定义中间件 请求1")

    def process\_response(self,request, response):
        print("这是自定义中间件 响应1")
        return response


class myMinddle2(MiddlewareMixin):
    def process\_request(self, request):
        print("这是自定义中间件 请求2")

    def process\_response(self,request, response):
        print("这是自定义中间件 响应2")
        return response


setting.py:
MIDDLEWARE = [
    ......
    'wrapperMidd.myMinddle.myMinddle',
    'wrapperMidd.myMinddle.myMinddle2',
]

# 访问:http://127.0.0.1:8000/testMinddle/
# 结果
"""
这是自定义中间件 请求1
这是自定义中间件 请求2
testMinddle
这是自定义中间件 响应2
这是自定义中间件 响应1
"""

</code></pre> 
  <p>如果在第一个中间件直接返回,执行顺序如果:</p> 
  <pre><code>myMiddle.py:

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse

class myMinddle(MiddlewareMixin):
    def process\_request(self, request):
        print("这是自定义中间件 请求1")
        return HttpResponse("request")   """在这里直接返回"""
    def process\_response(self,request, response):
        print("这是自定义中间件 响应1")
        return response


class myMinddle2(MiddlewareMixin):
    def process\_request(self, request):
        print("这是自定义中间件 请求2")

    def process\_response(self,request, response):
        print("这是自定义中间件 响应2")
        return response

# 访问:http://127.0.0.1:8000/testMinddle/
# 结果:
网页上显示:request
后台显示:
"""
这是自定义中间件 请求1
这是自定义中间件 响应1
"""


</code></pre> 
  <h3>2.2.2 自定义中间件总结</h3> 
  <ol> 
   <li>自定义中间件先执行<code>process_request</code>再执行<code>views.py</code>里的视图函数,最后再执行<code>process_response</code>,而且<code>process_response</code>函数必须要返回 <code>return response</code></li> 
   <li>如果有多个自定义中间件,则执行顺序按<code>settings.py</code>里自上而下执行,写在上面的先执行。执行顺序</li> 
  </ol> 
  <pre><code>自定义中间件1 process_request--->自定义中间件2 process_request-->视图函数-->自定义中间件2 process_response -->自定义中间件1 process_response

</code></pre> 
  <ol start="3"> 
   <li>如果自定义中间件的<code>process_request</code>里有<code>return</code>返回,而这个中间件还是在上面,则它会执行自己定义的<code>process_request</code>和<code>process_response</code>,则视图函数和其他的中间件都不执行</li> 
   <li>如果自定义中间件的<code>process_request</code>里有<code>return</code>返回,而这个中间件上面还有其他的中间件,则会自上而下执行,执行到自定义中间件的<code>process_request</code>后就会执行<code>process_response</code>,则视图函数和它下面的中间件都不执行</li> 
  </ol> 
  <pre><code>MIDDLEWARE = [
    ...其他中间件...
    '自定义中间件1',
    '自定义中间件2',  # 自定义中间件2里使用return直接返回 
    '自定义中间件3',
]

执行顺序:
"""
其他中间件 process\_request --> 自定义中间件1 process\_request --> 自定义中间件2 process\_request --> 自定义中间件2 process\_response --> 自定义中间件1 process\_response -->其他中间件 process\_response
"""
视图函数和自定义中间件3是不执行的

</code></pre> 
  <h3>2.2.3 其他中间件函数</h3> 
  <p><code>process_view</code></p> 
  <pre><code>process_view在process_request之后,路由转发到视图,执行视图之前执行。

process_view() 只在 Django 调用视图前被调用。它应该返回 None 或 HttpResponse 对象。如果它返回 None ,Django 将继续处理这个请求,执行任何其他的 process_view() ,然后执行相应的视图。如果它返回 HttpResponse 对象,Django 不会去影响调用相应的视图;它会将响应中间件应用到 HttpResponse 并返回结果。


函数定义:
process_view(request, view_func, view_args, view_kwargs)
request 是一个 HttpRequest 对象。
view_func 是一个 Django 将要使用的 Python 函数。(这是一个真实的函数对象,不是函数的名称);view_args 是一个用来传递给视图的位置参数列表,;
view_kwargs 是一个用来传递给视图的关键字参数字典。
view_args 和 view_kwargs 都不包含第一个视图参数 ( request )。

</code></pre> 
  <p><code>process_exception</code></p> 
  <pre><code>视图执行中发生异常时执行。

当视图引发异常时,Django 会调用 process_exception()。process_exception() 应该返回 None 或 HttpResponse 对象。如果它返回一个 HttpResponse 对象,模板响应和响应中间件将被应用且会将结果响应返回浏览器。否则,就会开始默认异常处理( default exception handling )。

再次,中间件在响应阶段会按照相反的顺序运行,其中包括 process_exception 。如果异常中间件返回一个响应,那么中间件之上的中间件类的 process_exception 方法根本不会被调用。

函数定义:
process_exception(request, exception)
request 是一个 HttpRequest 对象。 exception 是一个由视图函数引发的 Exception 对象。

</code></pre> 
  <p><code>process_template_response</code></p> 
  <pre><code>视图函数刚执行完毕,process_response之前执行。


process_template_response() 在视图被完全执行后调用,如果响应实例有 render() 方法,表明它是一个 TemplateResponse 或等效对象。

它必须返回一个实现了 render 方法的响应对象。它可以通过改变``response.template_name`` 和 response.context_data 来改变给定的 response ,或者它可以创建和返回全新的 TemplateResponse 或等效对象。

不需要显式地渲染响应——一旦所有模板中间件被调用,响应会被自动渲染。

中间件会在响应阶段按照相反的顺序运行,其中包括 process_template_response() 。


函数定义:
process_template_response(request, response)

request 是一个 HttpRequest 对象。
response 是 TemplateResponse 对象(或者等效对象),它通过 Django 视图或中间件返回。


</code></pre> 
  <pre><code>from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse

class myMinddle(MiddlewareMixin):
    def process\_request(self, request):
        print("这是自定义中间件 请求1")

    def process\_response(self,request, response):
        print("这是自定义中间件 响应1")
        return response

    def process\_view(self,request, view\_func, view\_args, view\_kwargs):
        print("视图函数之前执行")

    def process\_exception(self,request,exception):
        print("处理视图函数")
        
访问http://127.0.0.1:8000/testMinddle/
结果:
这是自定义中间件 请求1
视图函数之前执行
testMinddle
这是自定义中间件 响应1


# 视图函数出错示例:
这是自定义中间件 请求1
视图函数之前执行
testMinddle
处理视图函数错误
这是自定义中间件 响应1

</code></pre> 
  <h3>2.3 新版本中间件写法</h3> 
  <p>官网上给的示例:</p> 
  <pre><code>class SimpleMiddleware:
    def \_\_init\_\_(self, get\_response):
        self.get_response = get_response
        # 配置和初始化

    def \_\_call\_\_(self, request):
        # 在这里编写视图和后面的中间件被调用之前需要执行的代码,即process\_request()
        response = self.get_response(request)

        # 在这里编写视图调用后需要执行的代码,即process\_response()

        return response

</code></pre> 
  <p>案例:</p> 
  <pre><code>使用官网上的写法不用继承 MiddlewareMixin

class SimpleMiddleware:
    def \_\_init\_\_(self, get\_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def \_\_call\_\_(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.
        print("这是自定义中间件 SimpleMiddleware的请求")
        response = self.get_response(request)

        # Code to be executed for each request/response after
        # the view is called.
        print("这是自定义中间件 SimpleMiddleware的响应")

        return response

# 执行结果:
这是自定义中间件 SimpleMiddleware的请求
testMinddle
这是自定义中间件 SimpleMiddleware的响应


</code></pre> 
  <p><strong>注意</strong></p> 
  <p><code>__init__(get_response)</code></p> 
  <p>中间件必须接受 <code>get_response</code> 参数。还可以初始化中间件的一些全局状态。记住两个注意事项:</p> 
  <ul> 
   <li>Django仅用 <code>get_response</code> 参数初始化您的中间件,因此不能定义 <code>__init__()</code> ,因为需要其他参数。</li> 
   <li>与每次请求都会调用 <code>__call__()</code> 方法不同,当 Web 服务器启动后,<code>__init__()</code> 只被调用<em>一次</em></li> 
  </ul> 
  <p>上面只定义了<code>process_request</code>和<code>process_response</code> 其中<code>process_view</code>和<code>process_exception</code>还是要写。</p> 
  <pre><code>class SimpleMiddleware:
    def \_\_init\_\_(self, get\_response):
        self.get_response = get_response
       
    def \_\_call\_\_(self, request):

        print("这是自定义中间件 SimpleMiddleware的请求")
        response = self.get_response(request)
        
        print("这是自定义中间件 SimpleMiddleware的响应")

        return response

    def process\_view(self,request, view\_func, view\_args, view\_kwargs):
        print("视图函数之前执行")

    def process\_exception(self,request,exception):
        print("处理视图函数错误")

</code></pre> 
  <h2>3.Csrf中间件</h2> 
  <p>使用<code>Django</code>框架使用<code>django.middleware.csrf.CsrfViewMiddleware</code>中间件,在前端页面提交操作的时候,会报错:</p> 
  <pre><code>Forbidden (403)
CSRF verification failed. Request aborted.

</code></pre> 
  <p>解决方法:</p> 
  <pre><code>如果使用form提交,则在前端页面里加入:
    {% csrf_token %}
如:

 
 {% csrf\_token %}
 username: 
 password:
 
 



如果是Ajax提交:
"""一定要导入jquery"""


 username: 
 password:
 



 $('#btn').click(function (){
 $.ajax({
 url: "",
 method: "post",
 data: {username: $('#user').val(), password: $('#pwd').val(), csrfmiddlewaretoken: '{{csrf\_token}}'},

 success: function (data) {
 console.log(data)

 }
 })

 })




# 使用cookie:
使用cookie 则要导入"""jquery.cookie.min.js"""


const csrftoken = $.cookie('csrftoken');

使用:


 username: 
 password:
 



 $('#btn').click(function (){
 const csrftoken = $.cookie('csrftoken');
 $.ajax({
 url: "",
 headers:{'X-CSRFToken': csrftoken}, // 加请求头。
 method: "post",
 data: {username: $('#user').val(), password: $('#pwd').val()},
 success: function (data) {
 console.log(data)

 }
 })

 })





</code></pre> 
  <p>全局使用csrf局部函数使用,或全局不使用,局部函数使用csrf</p> 
  <pre><code>from django.views.decorators.csrf import csrf_exempt,csrf_protect
# 全局使用,局部不使用
@csrf\_exempt
def xxx()

# 全局不使用(禁用掉),局部使用
@csrf\_protect
def yyy()

</code></pre> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1529852562826620928"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                                <li><a href="/article/116.htm"
                                       title="ViewController添加button按钮解析。(翻译)" target="_blank">ViewController添加button按钮解析。(翻译)</a>
                                    <span class="text-muted">张亚雄</span>
<a class="tag" taget="_blank" href="/search/c/1.htm">c</a>
                                </li>
                                <li><a href="/article/243.htm"
                                       title="mongoDB 简单的增删改查" target="_blank">mongoDB 简单的增删改查</a>
                                    <span class="text-muted">开窍的石头</span>
<a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a>
                                </li>
                                <li><a href="/article/370.htm"
                                       title="log4j配置" target="_blank">log4j配置</a>
                                    <span class="text-muted">0624chenhong</span>
<a class="tag" taget="_blank" href="/search/log4j/1.htm">log4j</a>
                                </li>
                                <li><a href="/article/497.htm"
                                       title="多点触摸(图片缩放为例)" target="_blank">多点触摸(图片缩放为例)</a>
                                    <span class="text-muted">不懂事的小屁孩</span>
<a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%82%B9%E8%A7%A6%E6%91%B8/1.htm">多点触摸</a>
                                </li>
                                <li><a href="/article/624.htm"
                                       title="有关浏览器窗口宽度高度几个值的解析" target="_blank">有关浏览器窗口宽度高度几个值的解析</a>
                                    <span class="text-muted">换个号韩国红果果</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a>
                                </li>
                                <li><a href="/article/751.htm"
                                       title="数据库产品巡礼:IBM DB2概览" target="_blank">数据库产品巡礼:IBM DB2概览</a>
                                    <span class="text-muted">蓝儿唯美</span>
<a class="tag" taget="_blank" href="/search/db2/1.htm">db2</a>
                                </li>
                                <li><a href="/article/878.htm"
                                       title="java笔记5" target="_blank">java笔记5</a>
                                    <span class="text-muted">a-john</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                </li>
                                <li><a href="/article/1005.htm"
                                       title="Web开发常用手册汇总" target="_blank">Web开发常用手册汇总</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.xml">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 IT知识库 IT610.com , All Rights Reserved.
            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>