Django学习19-站点地图

站点地图

  站点地图是网站上的一个XML文件,它会告知搜索引擎网站的更改频率以及页面的重要性。要创建站点地图,只需编写Sitemap类并在URLconf中指向它。
  要开启sitemap需要:

  • 添加django.contrib.sitemapsINSTALLED__APPS
  • TEMPLATES中,需要包含DjangoTemplates 后端,而且APP_DIRS要为True;
  • 确定已经安装了 sites 框架.

在urls.py中添加sitemap到URLconf中:

sitemaps = {
    'Topic': TopicSitemap,
}

urlpatterns = i18n_patterns(
    path(r'^i18n/', include('django.conf.urls.i18n')),
    path('admin/', admin.site.urls),
    path('', include('learning_logs.urls', namespace='learning_logs')),
    path('users/', include('users.urls', namespace='users')),
    path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap')
)+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

  sitemap文件的名字无关紧要,但是它在服务器上的位置却很重要。搜索引擎只索引你的sitemap中当前URL级别及其以下级别的链接。用一个实例来说,如果 sitemap.xml位于你的根目录,那么它将引用任何的URL。然而,如果你的sitemap位于 /content/sitemap.xml,那么它只引用以/content/打头的URL。
  sitemap的视图需要一个额外的参数{'sitemaps': sitemaps}sitemaps是一个字典表,格式为{标签:映射的Sitemap类或其实例}

Sitemap类

  创建一个 sitemaps.py ,添加自定义的Sitemap类:

from django.contrib.sitemaps import Sitemap
from learning_logs.models import Topic, Post

class TopicSitemap(Sitemap):

    # the change frequency of every object returned by items().
    changefreq = 'daily'
    priority = 0.5
    # 必须添加 提供对象列表。
    # 框架并不关心对象的类型,唯一关心的是这些对象。
    def items(self):
        return Topic.objects.all().filter()
    # 对象的最后修改日期
    def lastmod(self, obj):
        return obj.date_added

    # 给定对象的绝对URL。 绝对URL不包含协议名称和域名。
    # 如果没有提供 location , 框架将会在每个 items() 返回的对象上调用 get_absolute_url() 方法
    def location(self, obj):
        return f'/topic/{obj.id}'

  一个Sitemap类有如下的方法和属性:

  • items:必须添加的方法,返回一系列对象。框架并不关心对象的具体类型,唯一关心的是这些对象提供给其他方法或属性调用。
  • location:可以方法也可以是属性。返回给定对象的绝对URL。绝对URL不包含协议名称和域名:如'/foo/bar/', 如果没有提供 location , 框架将会在每个items()返回的对象上调用 get_absolute_url()方法
  • lastmod: 对象的最后修改日期,是一个datetime对象;
  • changefreq:代表对象变更的频率,可以选的值有:'always'hourlydaily'never'
  • priority : 取值范围在 0.0 和 1.0 之间,用来表明优先级,默认0.5,具体查看sitemap的官方说明;
  • protocol:URL中使用的协议名 httpshttp(默认);
  • limit:每页显示的URL数量,默认每页50000;
  • i18n:是否使用自定义的LANGUAGE来显示,默认False;

快捷方式创建sitemap

  通过GenericSitemap类可以快速创建sitemap,

from django.contrib.sitemaps import GenericSitemap
from django.contrib.sitemaps.views import sitemap
from django.urls import path
from blog.models import Entry

info_dict = {
    'queryset': Entry.objects.all(),
    'date_field': 'pub_date',
}

urlpatterns = [
    # some generic view using info_dict
    # ...

    # the sitemap
    path('sitemap.xml', sitemap,
         {'sitemaps': {'blog': GenericSitemap(info_dict, priority=0.6)}},
         name='django.contrib.sitemaps.views.sitemap'),
]

静态视图的sitemap

  通常,您希望搜索引擎抓取工具索引既不是对象的详细信息页,也不是平面页的视图。 解决方案是在项目中明确列出这些视图的URL名称,并在站点地图的location方法中调用reverse()。 例如:

# sitemaps.py
from django.contrib import sitemaps
from django.urls import reverse

class StaticViewSitemap(sitemaps.Sitemap):
    priority = 0.5
    changefreq = 'daily'

    def items(self):
        return ['main', 'about', 'license']

    def location(self, item):
        return reverse(item)

# urls.py
from django.contrib.sitemaps.views import sitemap
from django.urls import path

from .sitemaps import StaticViewSitemap
from . import views

sitemaps = {
    'static': StaticViewSitemap,
}

urlpatterns = [
    path('', views.main, name='main'),
    path('about/', views.about, name='about'),
    path('license/', views.license, name='license'),
    # ...
    path('sitemap.xml', sitemap, {'sitemaps': sitemaps},
         name='django.contrib.sitemaps.views.sitemap')
]

Sitemap索引

  sitemap框架同样可以根据 sitemaps 字典中定义的单独的sitemap文件来建立索引,它与其他sitemap的区别就在与sitemap.views.index()sitemap.view.sitemap():

from django.contrib.sitemaps import views

urlpatterns = [
    path('sitemap.xml', views.index, {'sitemaps': sitemaps}),
    path('sitemap-<section>.xml', views.sitemap, {'sitemaps': sitemaps},
         name='django.contrib.sitemaps.views.sitemap'),
]

  在这里sitemap需要接收一个section关键字。这将自动生成一个 sitemap.xml 文件, 它同时引用 sitemap-flatpages.xml 和 sitemap-blog.xml . Sitemap 类,而 sitemaps 目录根本没有更改。当站点的URL数量超过5000时,就应该创建一个索引,这样的话,Django会自动给sitemap进行分页。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
django-gridfs-storage是一个用于在Django项目中使用GridFS存储后端的库。GridFS是MongoDB的一种存储引擎,它可以用于存储大型文件,解决了传统的文件存储方式的一些限制。 使用django-gridfs-storage,我们可以轻松地在Django项目中将文件存储到MongoDB的GridFS中,同时利用Django提供的模型和视图来管理和访问这些文件。 使用django-gridfs-storage主要包含以下几个步骤: 1. 安装和配置:使用pip命令安装django-gridfs-storage库,并在Django的设置文件中添加相关配置,包括MongoDB连接信息和GridFS的collection名称等。 2. 模型定义:定义一个继承自django.db.models.FileField的字段,将其作为模型的一个属性。这个字段将用于存储文件在GridFS中的存储位置。 3. 视图和表单:在Django的视图中,使用GridFSStorage提供的一些方法来操作文件,比如保存文件、获取文件、删除文件等。同时,可以根据需要创建合适的表单来处理文件上传。 4. 文件访问:使用Django模板系统来展示文件或者生成文件的下载链接,可以通过模型实例的属性来获取文件的URL,然后在模板中使用该URL来创建适当的HTML链接标签。 使用django-gridfs-storage可以有效地管理大型文件的存储和访问,而无需担心文件大小限制等问题。同时,结合Django强大的开发框架,我们可以更加灵活和方便地处理文件的上传、下载和展示等操作。这使得django-gridfs-storage成为在Django项目中使用MongoDB存储文件的理想选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值