Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Django学习记录(二十):Django by example -- Blog(十六) #56

Open
PyxYuYu opened this issue Nov 30, 2016 · 0 comments
Open

Django学习记录(二十):Django by example -- Blog(十六) #56

PyxYuYu opened this issue Nov 30, 2016 · 0 comments
Labels

Comments

@PyxYuYu
Copy link
Owner

PyxYuYu commented Nov 30, 2016

Your attitude, not your aptitude, will determine your altitude.

0x01 Django

  • Build a Blog Application
    • Creating custom template filters
      • 创建自定义模板过滤器
      • Django 模板中有很多内建的过滤器
        • 过滤器形式
          • 一般情况下 : {{variable|my_filter}}
          • 提供一个参数 : {{variable|my_filter:"foo"}}
          • 有多个过滤器 : {{variable|filter1|filter2}}
      • 这个项目中需要创建一个自定义过滤器,用于使用 markdown 语法
      • 首先安装 Python Markdown 模块 pip install Markdown==2.6.7 或者用 PyCharm 安装
      • 编辑 blog_tags.py ,增加
        from django.utils.safestring import mark_safe
        import markdown
        
        @register.filter(name='markdown')
        def markdown_format(text):
            return mark_safe(markdown.markdown(text))
      • 注册模板过滤器的方法和注册模板标签的方法相似
      • Django 由于其安全性能,会自动转义 <,>,',"",& ,也就是自动转码的功能,在 HTML 代码渲染之前,会进行自动转义,然后再呈现出来,如果不进行转义的话,那么 XSS 就很容易被利用
      • markdown.markdown() 返回的是字符串格式的 HTML 代码,如果不进行 mark_safe() 告诉 Django 这些代码是安全的话,那么最后面渲染输出的就是转义后的代码,而不是 Markdown 格式的内容了
      • 分别在 post/list.htmlpost/detail.html 中导入 {% load blog_tags %}
      • 替换如下内容
        {{ post.body|linebreaks }}
        linebreaks 替换成 markdown
        {{ post.body|markdown }}
        {{ post.body|truncatewords:30|linebreaks }}
        linebreaks 替换成 markdown
        {{ post.body|markdown|truncatewords_html:30 }}
      • 多个过滤器的时候,后面的过滤器会继续过滤前面的内容,truncatewords_html 过滤器是截取带 HTML 标签的内容(不支持中文),自动闭合标签
    • Adding a sitemap to your site
      • 增加一个网站地图 sitemap 文件
      • sitemap 文件相当于给搜索引擎提供网站的目录,便于搜索引擎更有效率的在网站上进行爬行抓取
      • sitemap 文件是一个 XML 文件,提供了网站结构,之间的联系
      • Django 有一个 sitemap 框架,依赖于 django.contrib.sitessites 可以将网站和对象进行关联,运行这个框架的话,需要同时激活 sitemap 应用 和 sites 应用,自定义一个 site ID
       SITE_ID = 1
       
       INSTALLED_APPS = (
           ...
      	 'django.contrib.sites',
      	 'django.contrib.sitemaps',
       )
      • 激活后,需要在数据库中创建存储 sites 的表
       python manage.py migrate
      • sites 应用已经被同步到数据库,在 blog 文件夹下创建 sitemaps.py
       from django.contrib.sitemaps import Sitemap
       from .models import Post
       
       class PostSitemap(Sitemap):
           changefreq = 'weekly'
      	 priority = 0.9
      	 
      	 def items(self):
      	     return Post.published.all()
      		 
      	 def lastmod(self, obj):
      	     return obj.publish
      • 通过继承 sitemaps 模块中的 Sitemap 类来创建一个自定义的 sitemap
      • changefreqpriority 这个两个属性表明了 post pages 的改变频率和在网站中之间的关联
      • items() 函数返回了所有对象的查询集,默认情况下, Django 利用 get_absolute_url() 方法来获得每个 post 对象的 URL ,如果需要为每个对象指定 URL 的话,就要增加一个 location() 函数
      • lastmod() 函数通过 items() 获取每个对象,返回每个对象最后修改的时间(也就是 post 最后的发表时间)
      • 之后需要添加 sitemap URLurls.py
        from django.conf.urls import include, url
        from django.contrib import admin
        from django.contrib.sitemaps.views import sitemap
        from blog.sitemaps import PostSitemap
        
        sitemaps = { 'posts': PostSitemap, }
        
        urlpatterns = [
            url(r'^admin/', include(admin.site.urls)),
      	  url(r'^blog/', include('blog.urls', namespace='blog', app_name='blog')),
      	  url(r'sitemap\.xml$', sitemap, {'sitemaps': sitemaps},                   
      	      name='django.contrib.sitemaps.views.sitemap'),
        ]
      • 上面代码包含了所需要的模块后,定义了一个 sitemaps 字典,正则匹配了 sitemap.xmlsitemaps 字典被带入到 sitemap 视图中
      • sitemap.xml 中的每个 post URL 都是利用 get_absolute_url() 函数获得, lastmod() 函数获取了每个 post 最后更新的时间,而域名在这却是 example.com ,这个域名来源于 Site 对象(同步 sites 框架的时候,存储在数据库中)
      • 自定义这个域名,打开 http://localhost:8000/admin/sites/site ,修改为自定义的域名
    • Creating feeds for your blog posts
      • Feed 是消息源,也就是页面提供一些信息,是一种资料格式,网站透过它将资讯传播给用户,常用的 feed 格式有 RSS Atom 两种,用户可以订阅网站的先决条件是,网站提供了消息来源,消息来源又称为源料、馈送、资讯提供、供稿,将 feed 汇流于一处成为聚合( RSS 就是一种聚合技术 ),利用聚合器( RSS订阅器 )可以直接查看网站更新内容
@PyxYuYu PyxYuYu added the Django label Nov 30, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant