- 视图与网址进阶
- 这里学到了正则表达式的解释
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',) 这样就可以根据文章的状态去筛选,比如找出是草稿的文章
- 后台已经基本上做出来了,可是如果我们还需要显示一些其它的fields
-
举了一些例子
-
-
表单
-
使用 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 位置
-
自强学堂django学习笔记
猜你喜欢
转载自blog.csdn.net/weixin_38104825/article/details/81905309
今日推荐
周排行