GVKun编程网logo

Django的基本URL,位于Nginx Proxy之后(django中url如何使用)

17

对于想了解Django的基本URL,位于NginxProxy之后的读者,本文将提供新的信息,我们将详细介绍django中url如何使用,并且为您提供关于angularjs–ngRoute设置所有路由的

对于想了解Django的基本URL,位于Nginx Proxy之后的读者,本文将提供新的信息,我们将详细介绍django中url如何使用,并且为您提供关于angularjs – ngRoute设置所有路由的基本URL、Apache相当于Nginx的`proxy_buffering off`、Django 4.0 from django.conf.urls import url、django from组件 ,model—from,django的缓存机制,dango的信号,django的序列号的有价值信息。

本文目录一览:

Django的基本URL,位于Nginx Proxy之后(django中url如何使用)

Django的基本URL,位于Nginx Proxy之后(django中url如何使用)

我有一个简单的Django应用程序,它是在Nginx托pipe的。 我正在使用weasyprint来生成PDF报告。 weasyprint需要一个base_url属性来访问static文件。

虽然下面的django代码在本地机器上工作正常(在dev服务器下),但在Nginx后面发布502错误网关错误。

View.py

html = render_to_string('admin/enquiry/quoterequest/generate.html',{'enquiry': enquiry}) response = HttpResponse(content_type='application/pdf') response['Content-disposition'] = 'filename="Enquiry_{}.pdf'.format(enquiry.reference) weasyprint.HTML(string=html,base_url=request.build_absolute_uri()).write_pdf(response,stylesheets=[ weasyprint.CSS(settings.STATICFILES_Dirs[0] + '/css/print.css')])

上面的代码工作正常(没有打印图像),如果我删除了base_url属性。 将不胜感激您的input – 如何设置Nginx或从Django回收base_url

Nginxconfiguration

# configuration of the server server { listen 80; server_name 192.168.33.10; # Vagrant IP root /home/www/my_project; charset utf-8; client_max_body_size 75M; # max upload size location /media { alias /home/www/my_project/assets/uploads; } location /static { alias /home/www/my_project/assets/static; } location / { proxy_pass http://localhost:8001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }

print.css

@page { size: letter; margin: 1.5in .25in 1.9in .5in; @top-center { content: url("/uploads/header_footer/header.jpg"); height: 100%; width: 100%; } @bottom-center { background-image: url("/uploads/header_footer/footer.jpg"); background-repeat: no-repeat; background-position: center; content: "Page " counter(page); height: 100%; width: 100%; vertical-align: bottom;; } }

这是来自Nginx日志的错误信息。

如何在Windows中创build一个python文件可执行文件

使用与Windows和Python 2.6.1的猎豹模板系统(名称映射问题)

子域与文件夹/目录

重新configurationApache以从新的PHP源代码和旧的Django站点的特定子网站提供网站根目录

无法从Windows cmd安装Django。 尽pipePATH应该设置,“pip install django”显示错误

upstream prematurely closed connection while reading response header from upstream,client: 192.168.33.1,server: 192.168.33.10,request: "GET /enquiry/admin/enquiry/quoterequest/view/1/ HTTP/1.1",upstream: "http://127.0.0.1:8001/enquiry/admin/enquiry/quoterequest/view/1/",host: "192.168.33.10",referrer: "http://192.168.33.10/admin/enquiry/quoterequest/"

在虚拟环境中获取Django以通过Upstart运行

在Ubuntu 11.10上通过Nginx使用Django + uWsgi

AWS EC2上重定位实例的502错误网关

django request.POST包含<无法parsing>

如何访问django项目之外的目录文件?

回答我自己 – 但这是一种解决方法“。 对于这样的IP 192.168.33.10 ,并为它的基地址http://192.168.33.10/media/' base_url parameter for仍然有问题 – 即使手动输入基地址也没有办法。

这仍然不起作用,并返回与502坏网关

weasyprint.HTML(string=html,base_url='http://192.168.33.10/media/').write_pdf(response)

所以我决定改变template 。 所以无论我在哪里定义了一个URL,我都将它们改为…

<img src="http://{{ request.Meta.HTTP_HOST }}{{ MEDIA_URL }}{{ myapp.mymodel.my_image }}">

并在View.py添加context_instance以获得MEDIA_URL 。 希望有人会为weasyprint的base_url问题提出一个答案。

html = render_to_string('admin/enquiry/quoterequest/generate.html',{'enquiry': enquiry},context_instance=RequestContext(request)) response = HttpResponse(content_type='application/pdf') response['Content-disposition'] = 'filename="Enquiry_{}.pdf'.format(enquiry.reference) weasyprint.HTML(string=html,stylesheets=[ weasyprint.CSS(settings.STATICFILES_Dirs[0] + '/css/print.css')])

angularjs – ngRoute设置所有路由的基本URL

angularjs – ngRoute设置所有路由的基本URL

是否可以在AngularJS应用程序的所有路由中添加基本URL?基本上改变它在服务器上的位置(种类,如果这是有意义的,所以它将被访问不通过’/’但通过’/ something /’)。

为了添加一些上下文,我试图放置一个现有的Angular应用程序背后一些身份验证,使应用程序现在将访问地址说成功登录后http:// mysite / secure。

问题是如果我加载应用程序在http:// mysite / secure它工作正常(服务器显然会提供正确的页面),但单击任何链接将导致页面重新加载并路由到http:// mysite /#newpage而不是http:// mysite / secure /#newpage。

没有添加/安全/到所有的路由和链路元素是可能的?干杯,对不起,如果这不是写得好。

设置< base> HTML5标记可能有所帮助。从文档 here:

Relative links

Be sure to check all relative links,images,scripts etc. You must either specify the url base in the head of your main html file (<base href="/my-base">) or you must use absolute urls (starting with /) everywhere because relative urls will be resolved to absolute urls using the initial absolute url of the document,which is often different from the root of the application.

Running Angular apps with the History API enabled from document root is strongly encouraged as it takes care of all relative link issues.

Apache相当于Nginx的`proxy_buffering off`

Apache相当于Nginx的`proxy_buffering off`

我有一个应用程序需要我禁用反向代理中的缓冲。 我设法做到以下Nginxconfiguration:

server { listen 80; server_name 10.0.0.104; location / { proxy_buffering off; proxy_request_buffering off; proxy_http_version 1.1; proxy_set_header Connection ""; proxy_pass http://http_backend; proxy_redirect default; } } upstream http_backend { server 10.0.0.86:8080; keepalive 16; }

我需要在Apache上有相同的设置,但是Apache没有proxy_buffering off指令。 唯一能够在mod_proxy文档中find的conf是ProxyIOBufferSize和ProxyReceiveBufferSize但它们有一个最小值,而不是禁用缓冲的选项。 我与那些testing,但我的应用程序失败。

带有dynamic主机名的Apache ProxyPass

如何将Nginx设置为caching逆向代理?

Laravel路线在逆向代理之后

Nginx和带有代理传递的尾随斜杠

Nginx和socket.io解决方法

Django 4.0 from django.conf.urls import url

Django 4.0 from django.conf.urls import url

from django.conf.urls import url 不能使用,无法使用

Cannot find reference 'url' in '__init__.py'

url 已在Django 4.0中删除。请查看此处的发行说明:

https://docs.djangoproject.com/pl/4.0/releases/4.0/#features-removed-in-4-0

django.conf.urls.url() is removed.

 

@H_301_26@解决方法;

使用 re_path 替代 url

 

The easiest fix is to replace url() with re_path(). re_path uses regexes like url, so you only have to update the import and replace url with re_path.

from django.urls import include, re_path

from myapp.views import home

urlpatterns = [
    re_path(r'^$', home, name='home'),
    re_path(r'^myapp/', include('myapp.urls'),
]

Alternatively, you Could switch to using path. path() does not use regexes, so you'll have to update your URL patterns if you switch to path.

from django.urls import include, path

from myapp.views import home

urlpatterns = [
    path('', home, name='home'),
    path('myapp/', include('myapp.urls'),
]

If you have a large project with many URL patterns to update, you may find the django-upgrade library useful to update your urls.py files.

 

REF

https://forum.djangoproject.com/t/django-4-0-url-import-error/11065/3

https://stackoverflow.com/questions/70319606/importerror-cannot-import-name-url-from-django-conf-urls-after-upgrading-to

django from组件 ,model—from,django的缓存机制,dango的信号,django的序列号

django from组件 ,model—from,django的缓存机制,dango的信号,django的序列号

1.构建一个表单

假设你想在你的网站上创建一个简单的表单,以获得用户的名字。你需要类似这样的模板:

1
2
3
4
5
<form  action = "/your-name/"  method= "post" >
     <label  for = "your_name" >Your  name : </label>
     <input id= "your_name"  type= "text"  name = "your_name" >
     <input type= "submit"  value= "OK" >
</form>

这是一个非常简单的表单。实际应用中,一个表单可能包含几十上百个字段,其中大部分需要预填充,而且我们预料到用户将来回编辑-提交几次才能完成操作。

我们可能需要在表单提交之前,在浏览器端作一些验证。我们可能想使用非常复杂的字段,以允许用户做类似从日历中挑选日期这样的事情,等等。

这个时候,让Django 来为我们完成大部分工作是很容易的。

so,两个突出优点:

    1 form表单提交时,数据出现错误,返回的页面中仍可以保留之前输入的数据。

    2 方便地限制字段条件

 

                                      2.在Django 中构建一个表单

                      Form 类

    我们已经计划好了我们的 HTML 表单应该呈现的样子。在Django 中,我们的起始点是这里:

1
2
3
4
5
6
#forms.py
 
from django import forms
 
class NameForm(forms.Form):
    your_name = forms.CharField(label=''Your name'', max_length=100)

 它定义一个Form 类,只带有一个字段(your_name)。

字段允许的最大长度通过max_length 定义。它完成两件事情。首先,它在HTML 的<input> 上放置一个maxlength="100"(这样浏览器将在第一时间阻止用户输入多于这个数目的字符)。它还意味着当Django 收到浏览器发送过来的表单时,它将验证数据的长度。

Form 的实例具有一个is_valid() 方法,它为所有的字段运行验证的程序。当调用这个方法时,如果所有的字段都包含合法的数据,它将:

  • 返回True
  • 将表单的数据放到cleaned_data属性中。

完整的表单,第一次渲染时,看上去将像:

1
2
<label for="your_name">Your name: </label>
<input id="your_name" type="text" name="your_name" maxlength="100">

 注意它不包含 <form> 标签和提交按钮。我们必须自己在模板中提供它们。

                    视图:

发送给Django 网站的表单数据通过一个视图处理,一般和发布这个表单的是同一个视图。这允许我们重用一些相同的逻辑。

当处理表单时,我们需要在视图中实例化它:

 

 

如果访问视图的是一个GET 请求,它将创建一个空的表单实例并将它放置到要渲染的模板的上下文中。这是我们在第一个访问该URL 时预期发生的情况。

 

如果表单的提交使用POST 请求,那么视图将再次创建一个表单实例并使用请求中的数据填充它:form = NameForm(request.POST)。这叫做”绑定数据至表单“(它现在是一个绑定的表单)。

 

我们调用表单的is_valid()方法;如果它不为True,我们将带着这个表单返回到模板。这时表单不再为空(未绑定),所以HTML 表单将用之前提交的数据填充,然后可以根据要求编辑并改正它。

 

 

如果is_valid()True,我们将能够在cleaned_data 属性中找到所有合法的表单数据。在发送HTTP 重定向给浏览器告诉它下一步的去向之前,我们可以用这个数据来更新数据库或者做其它处理

 

 

            Django Form 类详解:

                绑定的和未绑定的表单实例

 

绑定的和未绑定的表单 之间的区别非常重要:

  • 未绑定的表单没有关联的数据。当渲染给用户时,它将为空或包含默认的值。
  • 绑定的表单具有提交的数据,因此可以用来检验数据是否合法。如果渲染一个不合法的绑定的表单,它将包含内联的错误信息,告诉用户如何纠正数据。
          •         字段详解

          • 考虑一个比上面的迷你示例更有用的一个表单,我们完成一个更加有用的注册表单:

          • #forms.py
            
            from django import forms
            
            class RegisterForm(forms.Form):
                username = forms.CharField(max_length=100,
                                           error_messages={"min_length":"最短为5个字符","required":"该字段不能为空"},
                                           )
                password = forms.CharField(max_length=100,
                                           widget=widgets.PasswordInput(attrs={"placeholder":"password"})
                                            )
            
                telephone=forms.IntegerField(
                    error_messages={
                        "invalid":"格式错误"
                    }
            
                                            )
            
            
                gender=forms.CharField(
                      initial=2,
                      widget=widgets.Select(choices=((1,''上海''),(2,''北京''),))
                         )
            
                email = forms.EmailField()
                is_married = forms.BooleanField(required=False)
            orms.py
            
            from django import forms
            
            class RegisterForm(forms.Form):
                username = forms.CharField(max_length=100,
                                           error_messages={"min_length":"最短为5个字符","required":"该字段不能为空"},
                                           )
                password = forms.CharField(max_length=100,
                                           widget=widgets.PasswordInput(attrs={"placeholder":"password"})
                                            )
            
                telephone=forms.IntegerField(
                    error_messages={
                        "invalid":"格式错误"
                    }
            
                                            )
            
            
                gender=forms.CharField(
                      initial=2,
                      widget=widgets.Select(choices=((1,''上海''),(2,''北京''),))
                         )
            
                email = forms.EmailField()
                is_married = forms.BooleanField(required=False)
            复制代码

            Widgets

            每个表单字段都有一个对应的Widget 类,它对应一个HTML 表单Widget,例如<input type="text">

            在大部分情况下,字段都具有一个合理的默认Widget。例如,默认情况下,CharField 具有一个TextInput Widget,它在HTML 中生成一个<input type="text">

            字段的数据

            不管表单提交的是什么数据,一旦通过调用is_valid() 成功验证(is_valid() 返回True),验证后的表单数据将位于form.cleaned_data 字典中。这些数据已经为你转换好为Python 的类型。

            注:此时,你依然可以从request.POST 中直接访问到未验证的数据,但是访问验证后的数据更好一些。

            在上面的联系表单示例中,is_married将是一个布尔值。类似地,IntegerField 和FloatField 字段分别将值转换为Python 的int 和float

            回到顶部

            使用表单模板

            你需要做的就是将表单实例放进模板的上下文。如果你的表单在Context 中叫做form,那么{{ form }}将正确地渲染它的<label> 和 <input>元素。

            表单渲染的选项

            对于<label>/<input> 对,还有几个输出选项:

            • {{ form.as_table }} 以表格的形式将它们渲染在<tr> 标签中
            • {{ form.as_p }} 将它们渲染在<p> 标签中
            • {{ form.as_ul }} 将它们渲染在<li> 标签中

            注意,你必须自己提供<table> 或<ul> 元素。

            {{ form.as_p }}会渲染如下:

          • <form action="">
                <p>
                    <label for="id_username">Username:</label>
                    <input id="id_username" maxlength="100" name="username" type="text" required="">
                </p>
             
             
                <p>
                    <label for="id_password">Password:</label>
                    <input id="id_password" maxlength="100" name="password" placeholder="password" type="password" required="">
                </p>
             
             
                <p>
                    <label for="id_telephone">Telephone:</label> <input id="id_telephone" name="telephone" type="number" required="">
                </p>
             
             
                <p>
                    <label for="id_email">Email:</label> <input id="id_email" name="email" type="email" required="">
                </p>
             
             
                <p>
                    <label for="id_is_married">Is married:</label> <input id="id_is_married" name="is_married" type="checkbox">
                </p>
             
             
                <input type="submit" value="注册">
            </form>
            View Code

             

          • 手工渲染字段:

            我们没有必要非要让Django 来分拆表单的字段;如果我们喜欢,我们可以手工来做(例如,这样允许重新对字段排序)。每个字段都是表单的一个属性,可以使用{{ form.name_of_field }} 访问,并将在Django 模板中正确地渲染。例如:

            1
            2
            3
            4
            5
            < div  >
                 {{ form.Username.errors }}
                 {{ form.Username.label_tag }}
                 {{ form.Username }}
            </ div >

            渲染表单的错误信息

            1、

            1
            2
            3
            registerForm=RegisterForm(request.POST)
            print(type(registerForm.errors))                      #< class  ''django.forms.utils.ErrorDict''>
            print(type(registerForm.errors["username"]))          #< class  ''django.forms.utils.ErrorList''>

            2、

            使用{{ form.name_of_field.errors }} 显示表单错误的一个清单,并渲染成一个ul。看上去可能像:

            1
            2
            3
            < ul  >
                 < li >Sender is required.</ li >
            </ ul >

             form组件的钩子

            复制代码
            def foo(request):
            
            
                if request.method=="POST":
            
                    regForm=RegForm(request.POST)
            
                    if regForm.is_valid():
                        pass
                        # 可用数据: regForm.cleaned_data,
                        # 将数据插入数据库表中
            
            
                    else:
                        pass
                        # 可用数据: regForm.errors
                        # 可以利用模板渲染讲errors嵌套到页面中返回
                        # 也可以打包到一个字典中,用于ajax返回
            
                else:
                    regForm=RegForm()
                return render(request,"register.html",{"regForm":regForm})
            
                
            
                ''''''
                实例化时:
            
                    self.fields={
                        "username":"字段规则对象",
                        "password":"字段规则对象",
            
                    }
            
            
                is_valid时:
            
                    self._errors = {}
                    self.cleaned_data = {}
            
            
                    #局部钩子:
            
                    for name, field in self.fields.items():
                          try:
            
                                value = field.clean(value)
                                self.cleaned_data[name] = value
                                if hasattr(self, ''clean_%s'' % name):
                                    value = getattr(self, ''clean_%s'' % name)()
                                    self.cleaned_data[name] = value
                          except ValidationError as e:
                                self.add_error(name, e)
            
                    # 全局钩子:
            
                    self.clean()     # def self.clean():return self.cleaned_data
            
                    return  not self.errors    # True或者False

             

                                                                    form组件补充

1、Django内置字段如下:

  

复制代码
Field
    required=True,               是否允许为空
    widget=None,                 HTML插件
    label=None,                  用于生成Label标签或显示内容
    initial=None,                初始值
    help_text='''',                帮助信息(在标签旁边显示)
    error_messages=None,         错误信息 {''required'': ''不能为空'', ''invalid'': ''格式错误''}
    show_hidden_initial=False,   是否在当前插件后面再加一个隐藏的且具有默认值的插件(可用于检验两次输入是否一直)
    validators=[],               自定义验证规则
    localize=False,              是否支持本地化
    disabled=False,              是否可以编辑
    label_suffix=None            Label内容后缀
 
 
CharField(Field)
    max_length=None,             最大长度
    min_length=None,             最小长度
    strip=True                   是否移除用户输入空白
 
IntegerField(Field)
    max_value=None,              最大值
    min_value=None,              最小值
 
FloatField(IntegerField)
    ...
 
DecimalField(IntegerField)
    max_value=None,              最大值
    min_value=None,              最小值
    max_digits=None,             总长度
    decimal_places=None,         小数位长度
 
BaseTemporalField(Field)
    input_formats=None          时间格式化   
 
DateField(BaseTemporalField)    格式:2015-09-01
TimeField(BaseTemporalField)    格式:11:12
DateTimeField(BaseTemporalField)格式:2015-09-01 11:12
 
DurationField(Field)            时间间隔:%d %H:%M:%S.%f
    ...
 
RegexField(CharField)
    regex,                      自定制正则表达式
    max_length=None,            最大长度
    min_length=None,            最小长度
    error_message=None,         忽略,错误信息使用 error_messages={''invalid'': ''...''}
 
EmailField(CharField)      
    ...
 
FileField(Field)
    allow_empty_file=False     是否允许空文件
 
ImageField(FileField)      
    ...
    注:需要PIL模块,pip3 install Pillow
    以上两个字典使用时,需要注意两点:
        - form表单中 enctype="multipart/form-data"
        - view函数中 obj = MyForm(request.POST, request.FILES)
 
URLField(Field)
    ...
 
 
BooleanField(Field)  
    ...
 
NullBooleanField(BooleanField)
    ...
 
ChoiceField(Field)
    ...
    choices=(),                选项,如:choices = ((0,''上海''),(1,''北京''),)
    required=True,             是否必填
    widget=None,               插件,默认select插件
    label=None,                Label内容
    initial=None,              初始值
    help_text='''',              帮助提示
 
 
ModelChoiceField(ChoiceField)
    ...                        django.forms.models.ModelChoiceField
    queryset,                  # 查询数据库中的数据
    empty_label="---------",   # 默认空显示内容
    to_field_name=None,        # HTML中value的值对应的字段
    limit_choices_to=None      # ModelForm中对queryset二次筛选
     
ModelMultipleChoiceField(ModelChoiceField)
    ...                        django.forms.models.ModelMultipleChoiceField
 
 
     
TypedChoiceField(ChoiceField)
    coerce = lambda val: val   对选中的值进行一次转换
    empty_value= ''''            空值的默认值
 
MultipleChoiceField(ChoiceField)
    ...
 
TypedMultipleChoiceField(MultipleChoiceField)
    coerce = lambda val: val   对选中的每一个值进行一次转换
    empty_value= ''''            空值的默认值
 
ComboField(Field)
    fields=()                  使用多个验证,如下:即验证最大长度20,又验证邮箱格式
                               fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),])
 
MultiValueField(Field)
    PS: 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用
 
SplitDateTimeField(MultiValueField)
    input_date_formats=None,   格式列表:[''%Y--%m--%d'', ''%m%d/%Y'', ''%m/%d/%y'']
    input_time_formats=None    格式列表:[''%H:%M:%S'', ''%H:%M:%S.%f'', ''%H:%M'']
 
FilePathField(ChoiceField)     文件选项,目录下文件显示在页面中
    path,                      文件夹路径
    match=None,                正则匹配
    recursive=False,           递归下面的文件夹
    allow_files=True,          允许文件
    allow_folders=False,       允许文件夹
    required=True,
    widget=None,
    label=None,
    initial=None,
    help_text=''''
 
GenericIPAddressField
    protocol=''both'',           both,ipv4,ipv6支持的IP格式
    unpack_ipv4=False          解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1, PS:protocol必须为both才能启用
 
SlugField(CharField)           数字,字母,下划线,减号(连字符)
    ...
 
UUIDField(CharField)           uuid类型
    ...
View Code

 

2、Django内置插件:

 

TextInput(Input)
NumberInput(TextInput)
EmailInput(TextInput)
URLInput(TextInput)
PasswordInput(TextInput)
HiddenInput(TextInput)
Textarea(Widget)
DateInput(DateTimeBaseInput)
DateTimeInput(DateTimeBaseInput)
TimeInput(DateTimeBaseInput)
CheckboxInput
Select
NullBooleanSelect
SelectMultiple
RadioSelect
CheckboxSelectMultiple
FileInput
ClearableFileInput
MultipleHiddenInput
SplitDateTimeWidget
SplitHiddenDateTimeWidget
SelectDateWidget
复制代码
View Code

 


3、常用选择插件:

 

# 单radio,值为字符串
# user = fields.CharField(
#     initial=2,
#     widget=widgets.RadioSelect(choices=((1,''上海''),(2,''北京''),))
# )
 
# 单radio,值为字符串
# user = fields.ChoiceField(
#     choices=((1, ''上海''), (2, ''北京''),),
#     initial=2,
#     widget=widgets.RadioSelect
# )
 
# 单select,值为字符串
# user = fields.CharField(
#     initial=2,
#     widget=widgets.Select(choices=((1,''上海''),(2,''北京''),))
# )
 
# 单select,值为字符串
# user = fields.ChoiceField(
#     choices=((1, ''上海''), (2, ''北京''),),
#     initial=2,
#     widget=widgets.Select
# )
 
# 多选select,值为列表
# user = fields.MultipleChoiceField(
#     choices=((1,''上海''),(2,''北京''),),
#     initial=[1,],
#     widget=widgets.SelectMultiple
# )
 
 
# 单checkbox
# user = fields.CharField(
#     widget=widgets.CheckboxInput()
# )
 
 
# 多选checkbox,值为列表
# user = fields.MultipleChoiceField(
#     initial=[2, ],
#     choices=((1, ''上海''), (2, ''北京''),),
#     widget=widgets.CheckboxSelectMultiple
# )
View Code

 

我们今天的关于Django的基本URL,位于Nginx Proxy之后django中url如何使用的分享已经告一段落,感谢您的关注,如果您想了解更多关于angularjs – ngRoute设置所有路由的基本URL、Apache相当于Nginx的`proxy_buffering off`、Django 4.0 from django.conf.urls import url、django from组件 ,model—from,django的缓存机制,dango的信号,django的序列号的相关信息,请在本站查询。

本文标签: