PyxYuYu/MyBlog

Django学习总结(七)

PyxYuYu opened this issue · 0 comments

Life is a sail trip full of chances and challenges.

0x01 Django

  • Django Blog 学习总结
    • Django Tips
      • URLconf urls.py
        • URLconf 解释器有关正则表达式中命名组和非命名组遵循的规则
          • 如有有任何命名的组, Django 会忽略非命名组而直接使用命名组
          • 只有非命名组, Django 会将所有非命名组以位置参数的形式传递
        • views.py 中视图函数传递参数的方法
          • 方法一:利用命名组或非命名组, Django 自动从 URL 中捕获所需变量对视图函数参数进行传递
          • 方法二:视图函数中的参数也可以用 urlpattrens 中字典变量来进行赋值
          from django.contrib.sitemaps.views import sitemap
          form blog.sitemaps import PostSitemap
          
          sitemaps = { 'posts': PostSitemap }
          
          urlpatterns = [
              url(r'sitemap\.xml$', sitemap, {'sitemaps': sitemaps}),
          ]
        • URLconf 是从上向下的解析顺序,所以可以在最上面匹配特定的视图(某个特定的URL)
           urlpatterns = [
               url(r'^auth/user/add/$', views.user_add_stage),
          	 url(r'^([^/])/([^/])/add/$', views.add_stage),
           ]
        • 在解析 URLconf 时,请求方法(例如 GET POST HEAD)不会被考虑,对于相同的 URL 所有请求方法都会被导向到相同的视图函数中,请求方法的处理就是在视图函数中完成
          • 例如: /post/?page=1 对应的是匹配 post/
        • 在任何时候,只要根目录是一致的情况,URLconf 都可以包含其他的 URLconf 模块,指向 include() 的正则表达式不包含 $ ,只包含一个斜杠,它将截断匹配的 URL ,将剩余的字符串发送给包含中的 URLconf 进一步匹配处理
           url(r'^blog/', include('blog.urls', name='blog', app_name='blog')),
      • views.py
        • URLconf捕捉到的变量传递给视图函数的参数是字符串,而不是其他类型,有些时候需要转换类型使用,比如 datetime.date(int(year), int(month), int(day))
        • 使用默认视图参数
          • 视图函数中定义的默认参数是字符串,而不是整数,因为 URL 捕捉到的是字符串
             # views.py
             
             def page(request, num='1')
                 #...
          • 一般应用于多个 URL 表达式指向同一视图函数,其中一个表达式没有任何传递参数,这个时候就会利用到定义的默认参数
        • 视图函数可以用 Python 中一个优雅的特性:带星号的可变参数 *args **kwargs
          • 这样就允许函数接受动态的、可变数量的、参数名只在运行时可知的参数
          • *args : 传递给函数的参数会保存为一个元组
          • **kwargs : 传递给函数的参数会保存为一个字典
      • 模板
        • 自动转义 escape
          • 在模板生成 HTML 时,会存在一定的风险,导致 XSS 漏洞的产生,所以 Django 默认会对模板中每个变量标签的输出进行转义,尤其是 \ > ' " & 这五个字符的转义
          • 如果需要关闭转义的话,有以下方法:
            • 单独变量,利用 safe 过滤器为单独变量关闭自动转义
               {{ data|safe }}
            • 模板块,利用 autoescape 来包含这个模板(或模板中常用的一部分),如果写在 base.html 中,被其他模板继承的话,也是继续有效果的
               {% autoescape off %}
                   {{ data }}
              	 {% block content %}
              	 {% endblock %}
              	 {% autoescape on %}
              	     {{ data }}
              	 {% endautoescape %}
               {% endautoescape %}
          • 过滤器参数中的字符串常量是不会被自动转义的,如果关闭了自动转义
             {{ data|default:"xxxxx" }}
          • 上面过滤器表示,如果 data 空,那么输出默认的 xxxxx
          • 所以默认的 xxxxx 中最好不要带 \ > ' " & ,要带的话,也应该先讲他们转义,再进行输入
      • 外键 和 多对多值
        • 通过 属性名(小写) + _set 可以反向获取其内容
        • 属性名_set 是一个 QuerySet 查询集
           class Author(models.Model):
               name = models.CharField(max_length=25)
          	 age = models.IntegerField()
           # 一本书一个作者
           class Book(models.Model):
               author = models.ForeignKey(Author)
          	 title = models.CharField()
        • 从作者获取书籍
           a = Author.objects.get(name='xxx')
           books = a.book_set.all()