您的位置:68399皇家赌场 > 集群主机 > 皇家赌场:django-模板初探,django-初探

皇家赌场:django-模板初探,django-初探

发布时间:2019-05-06 19:39编辑:集群主机浏览(155)

    在地点的例证中,模板文件b.html内容如下:

    听闻hi-nginx的web开荒(python篇)——使用jinja二模板引擎,hi-nginxjinja二

    模板引擎的选用在web开垦中是不可防止和必备的。hi.py框架使用jinja二作为模板引擎。

    为了利用hi.py提供的jinja二引擎,首先必要引进它:

    from hi import hi,template
    

    接下来就是利用它:

    1 @app.route(r'^/template/(?P<name>w )/(?P<age>d )/?$',['GET'])
    2 def tpl(req,res,param):
    3     param['title']='jinja2 测试'
    4     tpl_engine = template(os.path.join(os.getcwd(),'python/templates'))
    5     res.content(tpl_engine.file_render('b.html',param))
    6     res.status(200)
    

    开创template实例供给七个参数,它内定引擎搜索模板文件的目录,在上边的代码中正是hi-nginx安装目录下的python/templates文件夹。

    下一场计划数据,数据运用dict来采集,使用file_render方法通过点超级模特板文件和数码dict来输出字符串内容。

    设若运用的不是模板文件,而是模板字符串,那就采纳string_render方法,它的率先个参数指的是字符串模板。

     

    在上头的例子中,模板文件b.html内容如下:

    1 {% extends 'a.html'  %}
    2 {% block body %}
    3     {{ super()  }}
    4     继承
    5 {{ name  }} is {{ age }} years old.
    6 {% endblock %}
    

    中间使用了jinja第22中学的模板承接作用,见第一行。因而,还有个模板文件a.html:

    <html>
        <head><title>{{ title }}</title></head>
        <body>{% block body %}
            <p>Hello:{{ name }},you are {{ age }} years old.</p>
            <p>加载器负责从诸如文件系统的资源加载模板</p>
            {% endblock %}
        </body>
    </html>
    

     

    在本例中,中文内容已经冒出。因而供给利用utf-八编码。hi-nginx已经到家辅助python3,所以,尽情汉语吧!

     

    模板引擎的采纳在web开拓中是不可转败为胜和须求的。hi.py框架使用jinja2作为...

     

    TEMPLATE_DEBUG:

    默认:False

      在1.八本子起头抛弃,改为在  OPTIONS 字典中设置 'debug' 键及其值。

      那是1个布尔值,表示是或不是开启模板的 debug 格局。假如为 True ,那么在模板渲染的时候接触任何尤其时,将呈现二个详细的荒唐页面,错误页面中包蕴模板的连带代码,并会用适当的艺术强度错误的地方。

      唯有在为 True 的时候才会显得这几个页面,所以在开拓阶段能够拉开以便调节和测试。

      另外,DEBUG 设置也有左近的效果。

    from hi import hi,template
    

    TEMPLATE_CONTEXT_PROCESSORS:

    默认:

    ["django.contrib.auth.context_processors.auth",
    "django.template.context_processors.debug",
    "django.template.context_processors.i18n",
    "django.template.context_processors.media",
    "django.template.context_processors.static",
    "django.template.context_processors.tz",
    "django.contrib.messages.context_processors.messages"]
    

     

      在一.第88中学是一个元祖,在一.玖中是3个列表,但是里面包车型地铁情节是一样的。在壹.捌本子中曾经丢掉了,现在理应在 OPTIONS中,使用 'context_processors' 来代替,就像文章一开始的那个例子那样。当然这里针对的是 django 模板引擎。另外,在1.8版本开始,内置的模板上下文处理器从 django.core.context_processors 移动到 django.template.context_processors 中。

      这是三个列表,列表里面包车型客车给个要素应该是二个字符串,字符串的剧情是3个可调用的靶子,它们被用来在伸手上下文(RequestContext)中填充特定的剧情。这么些可调用的指标将获得二个 request 对象作为参数,同时重临四个分包成员的字典,那么些字典中的成员将被用来填充内容。

    上面是里面包车型地铁三个函数:

    def static(request):
        """
        Adds static-related context variables to the context.
        """
        return {'STATIC_URL': settings.STATIC_URL}
    

     

     

    TEMPLATE_LOADERS

    默认:

    ['django.template.loaders.filesystem.Loader',
     'django.template.loaders.app_directories.Loader']
    

     

      在一.九中是一个列表,在一.第88中学是一个元祖,里面的剧情倒是未有变。

      其它,在壹.捌本子之后,应该在 OPTIONS字典中使用``'loaders' 键作为取代。

      容器中的种种成分应该是个字符串,每种字符串是二个可调用的python路线,所代表的是用于加载模板所运用的类。每种类都精晓如何从特定源导入模板。别的,能够选拔贰个元祖来庖代字符串,元祖中的第2个因素是 Loader 所在的模块,剩下的要素传递给 Loader 用于早先化的。

      注意:这里能够阅览 DIRS 中的路线查找比 app 目录中的优先。

     

    模板引擎的利用在web开采中是不可翻盘和须要的。hi.py框架使用jinja二作为模板引擎。

      DIRS:寻觅模板的不二等秘书诀顺序,模板引擎将依照内部的依次来寻找模板文件。默认为空列表。注意:这里的渠道应该是django能够访问的门路,因为咱们的服务器一般运营在linux平高雄,而linux平台对于权力的治本非凡严苛。一般大家的django的经过 wsgi 运营在 web 服务器后边时,如Apache、nginx等,服务器的权能是什么样,django的权位正是怎么着。

    'file_charset '

      是 OPTIONS字典中的一个键,其值表示从磁盘中读取模板文件时所用的字符集,默认为FILE_CHARSET 的值(‘utf-8’),而 FILE_CHARAV肆SET 是管理从磁盘中开发文件时所用的字符集,蕴含模板文件和开首SQL数据文件。

     

    下边七个是一.九中新增添的:

    'libraries'

      它的值是八个字典,字典中涵盖了标签和模板模块路线,路线用Python的点路线表示,用于在模板引擎中注册它们。这足以用来增多新的库或为现存的库提供备用标签。

    例如:

    OPTIONS={
        # 其他设置
        'libraries': {
            'myapp_tags': 'path.to.myapp.tags',
            'admin.urls': 'django.contrib.admin.templatetags.admin_urls',
        },
        # 其他设置
    }
    

      能够经过将相应的字典键传递到 {% load %} 标签,以加载库。举个例子: {% load 'myapp_tags' %}

     

    'builtins'

      三个列表,列表中的元素是二个python点路线的字符串,用来从沙盘标签模块中增加 built-ins(内建)的价签。

    例如:

    OPTIONS={
        'builtins': ['myapp.builtins'],
    }
    

      内建的价签和过滤器能够在不调用{% load %} 标签的情事下调用。

     


     

    1 {% extends 'a.html'  %}
    2 {% block body %}
    3     {{ super()  }}
    4     继承
    5 {{ name  }} is {{ age }} years old.
    6 {% endblock %}
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    

    渲染

      依据约定,查找到的沙盘,也正是调用地点多个寻找模板的函数后,将赶回八个由后端模板引擎所定义的 Template 对象,该目标必须实现 render()方法,所以在自定义模板引擎的时候要要小心那或多或少。

     Template.render(context=None, request=None) 

      context:它必须是三个python字典对象(dict),将用那几个字典对模板实行渲染,假设未有提供,将运用贰个空的字典。

      request:它必须是2个 Httprequest 对象,后端引擎必须妥善管理它,同时还要管理 CSHummerH贰F 令牌,当然如何落到实处是后端引擎做的事,也在于区别的后端引擎。

     render_to_string(template_name[, context][, context_instance][, request][, using]) 

      也是坐落 django.template.loader 中,用于将模板渲染后回到字符串。

      template_name:模板名称,假如是多少个字符串,将调用 get_template() 方法;假如是3个列表将调用 select_template() 方法。

      context:三个python字典,用来渲染模板。

      context_instance:从1.八版本起遗弃,这里不再探究。

      request:必须是二个 HttpRequest 对象,并且在整人体模型版渲染期都以可用的。

      using:用来内定查找模板的内燃机。

     


     

     

    'file_charset '

      是 OPTIONS字典中的一个键,其值表示从磁盘中读取模板文件时所用的字符集,默认为FILE_CHARSET 的值(‘utf-8’),而 FILE_CHA汉兰达SET 是管制从磁盘中开采文件时所用的字符集,蕴含模板文件和开始SQL数据文件。

     

    上面多少个是一.九中新扩张的:

    'libraries'

      它的值是多个字典,字典中涵盖了标签和模板模块路线,路线用Python的点路线表示,用于在模板引擎中注册它们。那能够用来增加新的库或为现成的库提供备用标签。

    例如:

    OPTIONS={
        # 其他设置
        'libraries': {
            'myapp_tags': 'path.to.myapp.tags',
            'admin.urls': 'django.contrib.admin.templatetags.admin_urls',
        },
        # 其他设置
    }
    

      能够经过将相应的字典键传递到 {% load %} 标签,以加载库。举个例子: {% load 'myapp_tags' %}

     

    'builtins'

      贰个列表,列表中的成分是三个python点路线的字符串,用来从沙盘标签模块中加多 built-ins(内建)的标签。

    例如:

    OPTIONS={
        'builtins': ['myapp.builtins'],
    }
    

      内建的标签和过滤器能够在不调用{% load %} 标签的意况下调用。

     


     

    TEMPLATE_STRING_IF_INVALID

    默以为:''(空字符串)

      在1.8本子之后,应该在 OPTIONS字典中使用'string_if_invalid' 键作为代替。

      当模板中利用的变量是不行的(比如拼写错误)时,用来替代输出的字符串。

    在本例中,中文内容已经冒出。因而供给动用utf-八编码。hi-nginx已经周全协理python三,所以,尽情汉语吧!

    加载模板

    django.template.loader 定义了八个函数以加载模板

    1. get_template(template_name[, dirs][, using]) 

      该函数使用给定的名号加载模板并回到贰个Template 对象.(该名称是字符串类型,能够是文件名称,也足以是包蕴路线分隔符 / 的名称)

      所获取的再次回到值并不是  django.template.Template 的实例,而是后端模板引擎所定义的 Template 对象。

    get_template()会尝试获得从全体的门径中赢得模板。要是模板无法得逞找到,将会抛出 TemplateDoesNotExist. 假若能够找到模板但是包括违规值,将会抛出 TemplateSyntaxError.

      模板的研究和加运载飞机制取决于各类后台引擎和布置。

      template_name:模板的称呼,django会依照计划用那么些名字去寻觅钦命的模版。

    比方,当配置为上面所示时:

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [
                '/home/html/example.com',
                '/home/html/default',
            ],
        },
        {
            'BACKEND': 'django.template.backends.jinja2.Jinja2',
            'DIRS': [
                '/home/html/jinja2',
            ],
        },
    ]
    

    假令你调用函数get_template('story_detail.html'), Django按以下顺序查找story_detail.html:

    • /home/html/example.com/story_detail.html ('django' engine)
    • /home/html/default/story_detail.html ('django' engine)
    • /home/html/jinja2/story_detail.html ('jinja2' engine)

      会先用第一个引擎,然后再利用第二个引擎的配备实行寻找,当找到第四个适合的文书时,就能够停下寻觅,也正是前边也有同名的公文的话,将会‘失明’。

      此外,大家可以使用包罗路线的名目,django也援引那样做,最棒的章程正是为每三个app建构三个同名的目录,然后在该目录下放置那个app要用到的沙盘,那样可避防止重名难点推动的模版查找错误,举例: get_template('news/story_detail.html') 

    • /home/html/example.com/news/story_detail.html ('django' engine)
    • /home/html/default/news/story_detail.html ('django' engine)
    • /home/html/jinja2/news/story_detail.html ('jinja2' engine)

       dirs :该参数从壹.8起被移除,这里不再钻探。

       using:表示要利用哪个引擎进行查找,该参数接受的是模板引擎的 NAME ,详细情况参见上面包车型地铁配置中的 NAME。默以为 None ,如上边包车型大巴例子所示,为 None 时将应用七个引擎举行搜寻,三个引擎按安顿的次序举行查找,假诺钦命了利用有些引擎,另叁个引擎就不会再查找了。

     

    2. select_template(template_name_list[, dirs][, using]) 

      select_template() 和 get_template()很一般, 只但是它用了三个模板名称的列表作为参数。按顺序搜索模板名称列表内的沙盘并赶回第一个留存的模板。

    譬如说:借使您调用函数 select_template(['story_253_detail.html', 'story_detail.html']), Django按以下顺序查找:

    • /home/html/example.com/story_253_detail.html ('django' engine)
    • /home/html/default/story_253_detail.html ('django' engine)
    • /home/html/jinja2/story_253_detail.html ('jinja2' engine)
    • /home/html/example.com/story_detail.html ('django' engine)
    • /home/html/default/story_detail.html ('django' engine)
    • /home/html/jinja2/story_detail.html ('jinja2' engine)

      其余的参数都是千篇一律的,这里不重复认证。

      你能够通过 select_template() 来完成越来越灵活的模版加载。比如: select_template(['story_%s_detail.html' %story.id, 'story_detail.html'])的形式。

     


     

    火速函数

      一般来说大家得以将渲染后的字符串作为 HttpResponse 的率先个参数,作为营造响应报文的着保养。

      由于那些动作其实太常有了:加载--渲染--重返;所以django提供了五个神速函数来管理这一个业务。

      那多个位于 django.shortcuts 模块中,在行使前记得发轫入。

     render(request, template_name[, context][, context_instance][, content_type][, status][, current_app][, dirs][, using]) 

      那些函数完成查找,加载,渲染,塑造 HttpResponse 对象1整套流程,所以大家可以利用它来节省数不完素养。

      request:用于转移 response 对象的 request 对象。

      template_name:模板名称,只怕是包蕴众多模板名称的列表。

      context:渲染使用的python字典。

      context_instance:一.八版本起放任,这里不再钻探。

      content_type:指定 MIME 类型,默认为 DEFAULT_CONTENT_TYPE  的值。

      status:响应的状态码,默感到200.

      current_app:提醒哪个应用包蕴当前的视图。壹.八本子后甩掉,今后要安装 request.current_app 进行代替。

      using:用于加载模板使用的模版引擎的名称

    例子:

    from django.shortcuts import render
    
    def my_view(request):
        # View code here...
        return render(request, 'myapp/index.html', {"foo": "bar"},
            content_type="application/xhtml xml")
    

    以此示例等同于:

    from django.http import HttpResponse
    from django.template import RequestContext, loader
    
    def my_view(request):
        # View code here...
        t = loader.get_template('myapp/index.html')
        c = RequestContext(request, {'foo': 'bar'})
        return HttpResponse(t.render(c),
            content_type="application/xhtml xml")
    

     

     

    2. render_to_response(template_name[, context][, context_instance][, content_type][, status][, dirs][, using]) 

      参数和方面包车型大巴同样,就是少了 request 参数。

    例子:

    from django.shortcuts import render_to_response
    
    def my_view(request):
        # View code here...
        return render_to_response('myapp/index.html', {"foo": "bar"},
            content_type="application/xhtml xml")
    

    以此示例等同于:

    from django.http import HttpResponse
    from django.template import Context, loader
    
    def my_view(request):
        # View code here...
        t = loader.get_template('myapp/index.html')
        c = Context({'foo': 'bar'})
        return HttpResponse(t.render(c),
            content_type="application/xhtml xml")
    

     

     

      在此地,我们来看了四个从未见过的函数:Context();RequestContext()。并且渲染的时候使用的是那五个函数的再次来到值,并不是专门的学业的python字典。那和法定文书档案的传道貌似有点冲突,其原版的书文是这般的:If context is provided, it must be a dict. If it isn’t provided, the engine will render the template with an empty context.

      而自己起来看了这么些类的代码后,认为其应有是对于python字典的1种扩充,所以称其为 dict 也依旧说得过去的。可是当大家利用神速函数的时候,所传递的还是是python的正规字典,因为火速函数内部做了更改的拍卖,关于那多个函数,等我商量一番后在说。

      此外,这里要补偿某个,当张开了 CS翼虎F 中间件后,并拍卖 POST 的表单时,请使用 render 函数,而不是 render_to_response,唯有 render 函数会管理 csrf token,不然你只怕会面对 csrf 的报错。

     

    一般来说,大家在视图函数中拍卖各样工作逻辑之后,应该回到一个HttpResponse 对象。而HttpResponse 对象的第七个...

    里面使用了jinja第22中学的模板承袭成效,见第3行。因而,还有个模板文件a.html:

    TEMPLATE_DEBUG:

    默认:False

      在一.八本子初阶扬弃,改为在  OPTIONS 字典中设置 'debug' 键及其值。

      那是四个布尔值,表示是还是不是张开模板的 debug 形式。假使为 True ,那么在模板渲染的时候接触任何尤其时,将突显二个详细的荒唐页面,错误页面中蕴藏模板的相干代码,并会用适当的办法强度错误的地点。

      只有在为 True 的时候才会突显这一个页面,所以在开辟阶段能够张开以便调节和测试。

      另外,DEBUG 设置也有像样的功用。

    TEMPLATE_CONTEXT_PROCESSORS:

    默认:

    ["django.contrib.auth.context_processors.auth",
    "django.template.context_processors.debug",
    "django.template.context_processors.i18n",
    "django.template.context_processors.media",
    "django.template.context_processors.static",
    "django.template.context_processors.tz",
    "django.contrib.messages.context_processors.messages"]
    

     

      在1.第88中学是3个元祖,在一.九中是一个列表,可是里面包车型客车剧情是平等的。在1.八版本中壹度丢掉了,以往应当在 OPTIONS中,使用 'context_processors' 来代替,就像文章一开始的那个例子那样。当然这里针对的是 django 模板引擎。另外,在1.8版本开始,内置的模板上下文处理器从 django.core.context_processors 移动到 django.template.context_processors 中。

      那是叁个列表,列表里面包车型地铁给个要素应该是1个字符串,字符串的源委是1个可调用的靶子,它们被用来在伏乞上下文(RequestContext)中填充特定的剧情。那一个可调用的目的将得到贰个 request 对象作为参数,同时返回三个富含成员的字典,那一个字典中的成员将被用来填充内容。

    上面是个中的三个函数:

    def static(request):
        """
        Adds static-related context variables to the context.
        """
        return {'STATIC_URL': settings.STATIC_URL}
    

     

     

    假使选用的不是模板文件,而是模板字符串,那就动用string_render方法,它的首先个参数指的是字符串模板。

    django-模板初探,django-初探

      一般来讲,大家在视图函数中拍卖各类事情逻辑之后,应该回到三个HttpResponse 对象。而 HttpResponse 对象的率先个参数接受字符串恐怕是迭代器,作为响应报文的重心。不过那象征大家要将 HTML 内容写到 python 的代码中,或然写到二个文书中,然后用 python 张开,将可迭代的文件对象作为第3个参数。

      那样的结果是:

      壹、代码很混乱,而且实际专门的学业中前后端一般是由分歧的技术员管理的,让也许不懂 python 的前端人士在 python 文件中书写 HTML 代码是壹件很凶险并且功效低下的作业。

      2、内容很难做到动态退换,那就错过的动态变化页面包车型大巴优势了。

      为了化解以上的主题材料,django引进了模板层,当然那也是享有服从MVC框架都有的。在壹.八版本此前,django只帮衬内置的django模板引擎,简称为 DTL;在一.捌事后,django还到场了对 jinja二的协助,不过,倘让你要选用jinja2模板引擎的话,还亟需协调去下载jinja2的库( pip install Jinja二 ),因为django只提供了接口的支撑。其余,如何你还有使用其它的第一方引擎,或许要拓展 后端(BACKEND)的自定义,因为django只提供了 DTL 和jinja二的后端支持。

      接下去来看望哪些计划利用。

      模板的安顿是通过 setting.py 中的 TEMPLATES 变量进行的,下面是通过 startproject 命令生成的项目中(1.9版本),在 setting 中的默认配置:

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    

     

      首先,TEMPLATES 是1个列表,列表中的各类元素都是三个字典,各类字典代表2个模板引擎。上边的便是暗中同意的计划,代表只利用 django 自带的 DTL 模板引擎,当然假设你有供给同时使用多少个模板引擎的话,能够那样布置:

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [
                '/home/html/example.com',
                '/home/html/default',
            ],
        },
        {
            'BACKEND': 'django.template.backends.jinja2.Jinja2',
            'DIRS': [
                '/home/html/jinja2',
            ],
        },
    ]
    

      那样就足以依赖要求利用不一致的引擎了,一般通过函数的 using 参数来钦定引擎的 NAME。关于那多个参数的意思上边会议及展览开深切的讲授。

      接下去看看要怎么布局:

      TEMPLATES:默许是贰个空驶列车表,列表中的每种成分都以字典,各样字典代表一个模板引擎的安插。一般大家采取 startproject 命令来扭转项目时,这里都会自行填写为率先个例子所示的内容,当然因版本的不等会大相径庭。倘诺你不准备动用模板的话,也足以把内部的成分删掉,只留四个空驶列车表。

      BACKEND:后端,是字典中的1个键,当然接下去的富有安装都投身字典中,下边就不1一表达重申了。未有私下认可值。这里应该是3个字符串,字符串的源委是可调用的 python 路线,也正是说假设在 python 中 import 的时候,应该力所能致找到。django支持的后端都坐落 django.template.backends 目录下,举个例子:

    皇家赌场 1

      它们是模块中的三个类,这么些类继承于 BaseEngine :

    皇家赌场 2

    皇家赌场 3

      更加深档次的东西这里就不三番五次斟酌了。

      NAME:模板引擎的别称,日常会在各样函数的 using 中用到。默以为定义后端(backends)的模块的称谓,由上海体育地方能够,django的模板引擎的别名便是‘django’;jiaja2模板内燃机的外号便是‘jinja二’。

      DIRS:找出模板的路径顺序,模板引擎将依照内部的种种来寻觅模板文件。默以为空列表。注意:这里的门路应该是django能够访问的门道,因为大家的服务器一般运营在linux平桃园,而linux平台对于权力的军管拾叁分严格。一般大家的django的经过 wsgi 运营在 web 服务器前边时,如Apache、nginx等,服务器的权限是怎么,django的权限正是怎么着。

        APP_DIRS:默认为False,但是 startproject 命令会为大家设置为 True。告诉模板引擎是还是不是相应进入种种已设置的选用中寻找模板。每个模板引擎后端都定义了二个恒定的名目作为利用内存放模板的子目录的名号。比方,django的就叫做‘templates’ ;jinja2的正是‘jinja二’。

      OPTIONS:传递额外的参数给后端引擎,表示开启某些功能。可用的参数随着模板引擎的不同而不同。默认为一个空字典,当然 startproject 命令为我们填充了一些参数。

     上面是有个别旧版本中的脾性,在一.八在此以前,并不是因而的设置都在 TEMPLATES 变量中的,经常会分开设置:

    开创template实例必要三个参数,它钦定引擎搜索模板文件的目录,在上边的代码中正是hi-nginx安装目录下的python/templates文件夹。

     上面是有些旧版本中的性格,在1.八事先,并不是因而的设置都在 TEMPLATES 变量中的,平时会分手设置:

    TEMPLATE_DIRS

    在1.玖中暗中同意为1个空驶列车表,在壹.第88中学为1个空元祖。

      那是1个象征模板文件的路径的容器,当您调用  django.template.loaders.filesystem.Loader 函数时,将会按照里面的顺序搜索模板文件。

      注意,这么些门路应该使用Unix风格的正斜杠(/),纵然在Windows中运作。

      当然,在1.8以后,由 DIRS 代替他了,也正是开首的多少个例子中的那样。

    本文由68399皇家赌场发布于集群主机,转载请注明出处:皇家赌场:django-模板初探,django-初探

    关键词: 68399皇家赌场 django

上一篇:C#限制速度下载网络文件

下一篇:没有了