自强学堂django学习笔记

  • 视图与网址进阶
    • 这里学到了正则表达式的解释
      url(r'^add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),

      用括号括起来的意思是保存为一个子组,每一个子组将作为一个参数,被 views.py 中的对应视图函数接收。

  • 模板

    • 模板是可以继承的:以一个HTML文件为基础,拓展出其他的HTML模板

  • 模板进阶

    • 模板HTML上接收到一个参数是这么表示的

      {{ string }}

      用两层花括号括起来

    • 循环

      • HTML上可以写循环

        教程列表:
        {% for i in TutorialList %}
        {{ i }}
        {% endfor %}
        
        #注意TutorialList = ["HTML", "CSS", "jQuery", "Python", "Django"]
      • 循环上加逗号

        {% for item in List %}
            {{ item }}, 
        {% endfor %}

        这样最后会多一个逗号

      • 判断一下是不是最后一个就解决了

        {% for item in List %}
            {{ item }}{% if not forloop.last %},{% endif %} 
        {% endfor %}
      • 循环中好用的东西

        
        变量	                 描述
        forloop.counter	       索引从 1 开始算
        forloop.counter0	   索引从 0 开始算
        forloop.revcounter	   索引从最大长度到 1
        forloop.revcounter0	   索引从最大长度到 0
        forloop.first	       当遍历的元素为第一项时为真
        forloop.last	       当遍历的元素为最后一项时为真
        forloop.parentloop	   用在嵌套的 for 循环中,获取上一层 for 循环的 forloop
      • <ul>
        {% for athlete in athlete_list %}
            <li>{{ athlete.name }}</li>
        {% empty %}
            <li>抱歉,列表为空</li>
        {% endfor %}
        </ul>

        判断列表为空

    • 字典

      • 可以显示字典中的内容

        站点:{{ info_dict.site }} 内容:{{ info_dict.content }}
        
        #这里字典是info_dict = {'site': u'自强学堂', 'content': u'各种IT技术教程'}

        在模板中取字典的键是用点info_dict.site,而不是Python中的 info_dict['site']

      • 字典遍历

        {% for key, value in info_dict.items %}
            {{ key }}: {{ value }}
        {% endfor %}

        其实就是遍历这样一个 List:  [('site', u'自强学堂'), ('content', u'各种IT技术教程')]

    • if操作

      {% if var >= 90 %}
      成绩优秀,自强学堂你没少去吧!学得不错
      {% elif var >= 80 %}
      成绩良好
      {% elif var >= 70 %}
      成绩一般
      {% elif var >= 60 %}
      需要努力
      {% else %}
      不及格啊,大哥!多去自强学堂学习啊!
      {% endif %}

      注意:比较符号前后必须有至少一个空格!

    • 可以获取当前用户、网址、GET参数

  • 模型

  • QuerySet API:就是数据库接口,用来操作数据库,包括

    • 创建对象,也就是在数据库中添加记录

    • 获取对象,就是数据库里的查找

    • 删除符合条件的结果

    • 更新某个内容

    • 可迭代

    • QuerySet 是可以用pickle序列化到硬盘再读取出来的

    • 查询结果排序:不就是数据库的排序

    • 支持链式查询

    • 不支持负索引

    • 重复的问题,使用 .distinct() 去重

  • QuerySet 进阶

  • 自定义Field

    • Django 的官方提供了很多的 Field,但是有时候还是不能满足我们的需求,不过Django提供了自定义 Field 的方法

  • 数据表更改

    • 修改了models.py后运行

      python manage.py makemigrations
      python manage.py migrate

      这两行命令就会对我们的models.py 进行检测,自动发现需要更改的,应用到数据库中去。

  • 后台

    • admin.py中还有其它一些常用的功能

      • 后台已经基本上做出来了,可是如果我们还需要显示一些其它的fields
        class ArticleAdmin(admin.ModelAdmin):
            list_display = ('title','pub_date','update_time',)
      • 搜索功能:search_fields = ('title', 'content',) 这样就可以按照 标题或内容搜索了

      • 筛选功能:list_filter = ('status',) 这样就可以根据文章的状态去筛选,比如找出是草稿的文章

    • 举了一些例子

  • 表单

    • 使用 Django 的 表单 (forms)

  • 配置

    • ​​​​​​​settings.py 文件中有以下语句:

      import os
      BASE_DIR = os.path.dirname(os.path.dirname(__file__))

      这里用到了python中一个神奇的变量 __file__ 这个变量可以获取到当前文件(包含这个代码的文件)的路径。os.path.dirname(__file__) 得到文件所在目录,再来一个os.path.dirname()就是目录的上一级,BASE_DIR 即为 项目 所在目录

    • DEBUG=True 时,如果出现 bug 便于我们看见问题所在,但是部署时最好不要让用户看见bug的详情,可能一些不怀好心的人攻击网站,造成不必要的麻烦。

    • ALLOWED_HOSTS

    • static 是静态文件所有目录,比如 jquery.js, bootstrap.min.css 等文件

  • 静态文件

    • 静态文件是指 网站中的 js, css, 图片,视频等文件

    • 部署:

      • 1. 收集静态文件

        python manage.py collectstatic

        把以前放在app下static中的静态文件全部拷贝到 settings.py 中设置的 STATIC_ROOT 文件夹中

      • 2. 用 apache2 或 nginx 示例代码

  • 部署apache

    • 安装 apache2 和 mod_wsgi

    • 确认安装的apache2版本号

    • 准备一个新网站

    • 修改wsgi.py文件

    • 设置目录和文件权限

    • 激活新网站

    • 错误排查

  • 发送邮件

    • 比如有人提交了应聘的表单,可以向HR的邮箱发邮件,这样,HR不看网站就可以知道有人在网站上提交了应聘信息。

  • 数据导入

    • 从网上下载的一些数据,excel表格,xml文件,txt文件等有时候我们想把它导入数据库

    • 写个py脚本就可以导入了

  • 数据迁移

    • 数据库的迁移方法,包含不同数据库,如 SQLite3, MySQL, PostgreSQL 之间数据迁移方案,以及数据在不同机器上迁移方案

    • 简单的数据导出与导入

      • django 项目提供了一个导出的方法 python manage.py dumpdata
      • 数据导入,不需要指定 appname
      • 可以兼容各种支持的数据库,也就是说,以前用的是 SQLite3,可以导出后,用这种方法导入到 MySQL, PostgreSQL等数据库,反过来也可以。
    • 数据库的迁移

      • 用数据库自带的导出导入命令

  • 多数据库联用

    • 在一个 django project 中使用多个数据库的方法, 多个数据库的联用 以及多数据库时数据导入导出的方法

  • 用户注册系统

  • 缓存系统

    • Django 是动态网站,一般来说需要实时地生成访问的网页,展示给访问者,这样,内容可以随时变化,但是从数据库读多次把所需要的数据取出来,要比从内存或者硬盘等一次读出来 付出的成本大很多

    • 缓存系统工作原理:对于给定的网址,尝试从缓存中找到网址,如果页面在缓存中,直接返回缓存的页面,如果缓存中没有,一系列操作(比如查数据库)后,保存生成的页面内容到缓存系统以供下一次使用,然后返回生成的页面内容

      • Django settings 中 cache 默认为利用本地的内存来当缓存,速度很快。当然可能出来内存不够用的情况

      • 在 github 上也有用 redis 做 Django的缓存系统的

      • 利用文件系统来缓存

      • 利用数据库来缓存,利用命令创建相应的表:python manage.py createcachetable cache_table_name

  • 生成静态页面

    • 如果网站的流量过大,每次访问时都动态生成,执行SQL语句,消耗大量服务器资源,这时候可以考虑生成静态页面

  • 安全

  • 国际化

  • session

    • Django完全支持也匿名会话,简单说就是使用跨网页之间可以进行通讯,比如显示用户名,用户是否已经发表评论。session框架让你存储和获取访问者的数据信息,这些信息保存在服务器上(默认是数据库中),以 cookies 的方式发送和获取一个包含 session ID的值,并不是用cookies传递数据本身

    • 我理解的话就是自动保存用户名密码的那套机制

    • 启用session

    • 在视图中使用 session

      • request.session 可以在视图中任何地方使用,它类似于python中的字典

      • session 默认有效时间为两周,可以在 settings.py 中修改默认值

    • 例子

      • 比如写一个不让用户评论两次的应用:

        from django.http import HttpResponse
         
        def post_comment(request, new_comment):
            if request.session.get('has_commented', False):
                return HttpResponse("You've already commented.")
            c = comments.Comment(comment=new_comment)
            c.save()
            request.session['has_commented'] = True
            return HttpResponse('Thanks for your comment!')
      • 一个简化的登陆认证:

        def login(request):
            m = Member.objects.get(username=request.POST['username'])
            if m.password == request.POST['password']:
                request.session['member_id'] = m.id
                return HttpResponse("You're logged in.")
            else:
                return HttpResponse("Your username and password didn't match.")
                 
                 
        def logout(request):
            try:
                del request.session['member_id']
            except KeyError:
                pass
            return HttpResponse("You're logged out.")

        当登陆时验证用户名和密码,并保存用户id在 session 中,这样就可以在视图中用 request.session['member_id']来检查用户是否登陆,当退出的时候,删除掉它。

  • 传递数据给JS

  • Ajax

    • 有时候我们需要在不刷新的情况下载入一些内容,在网页的基本知识中我们介绍了 ajax 技术

  • Ajax CSRF 认证

  • Sitemap 站点地图

  • ORM

    • 可以用 Django QuerySet API 来创建,查询,删除,修改,不用写SQL语句。

  • 通用视图

    • 做一个博客,我们需要做一个文章列表,文章详情页,这种需求是比较普遍的,所以Django中提供了Class-Based Views

  • 上下文渲染器

    • 有时候我们想让一些内容在多个模板中都要有,比如导航内容,我们又不想每个视图函数都写一次这些变量内容,怎么办呢?这时候就可以用 Django 上下文渲染器来解决

  • 中间件

    • 我们从浏览器发出一个请求 Request,得到一个响应后的内容 HttpResponse,每一个请求都是先通过中间件中的 process_request 函数,这个函数返回 None 或者 HttpResponse 对象,如果返回前者,继续处理其它中间件,如果返回一个 HttpResponse,就处理中止,返回到网页上

      • 比如我们要做一个 拦截器,发现有恶意访问网站的人,就拦截他!

  • 微信接口

  • 单元测试

    • Django中有完善的单元测试,我们可以对开发的每一个功能进行单元测试,这样只要运行一个命令 python manage.py test,就可以测试功能是否正常。一言以蔽之,测试就是检查代码是否按照自己的预期那样运行。

  • 做minicms学到的

    • django.shortcuts.redirect 位置​​​​​​​

猜你喜欢

转载自blog.csdn.net/weixin_38104825/article/details/81905309