自强学堂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',) 这样就可以根据文章的状态去筛选,比如找出是草稿的文章
- 后台已经基本上做出来了,可是如果我们还需要显示一些其它的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 HttpResponsedef 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'] = Truereturn 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.idreturn 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:passreturn 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学习笔记相关推荐
- django 学习笔记
django 学习笔记 启动虚拟机: workon bj18_py3 创建一个项目: django-admin.py startproject mysite 启动开发用服务器:从外层项目 mysite ...
- 分享:Django学习笔记(4)---ManyToMany 添加、删除关联、查询
Django学习笔记(4)---ManyToMany 添加.删除关联.查询 http://my.oschina.net/u/572994/blog/105280
- django学习笔记03
原创博客地址:django学习笔记03 第一章,模型层 查询集API 一.QuerySet何时被提交 迭代 QuerySet是可迭代的,在首次迭代查询集时执行实际的数据库查询 切片:如果使用切片的&q ...
- django学习笔记02
原创博客地址:django学习笔记02 第一章:模型层 1.8 查询操作 一.创建对象 1 2 3 4 5 >>> from blog.models import Blog > ...
- django学习笔记01
原创博客地址:django学习笔记01 基于教程,刘江的博客教程Django教程:https://www.liujiangblog.com/course/django/87 第一章:模型层 1.1 模 ...
- Django学习笔记---第一天
Django学习笔记 1.Django的安装 //如果不指定版本号,默认安装最新版 pip3 install django==1.11.8 关于Django的版本和python的版本依赖关系,请看下图 ...
- 千锋Django学习笔记
千锋Django学习笔记 文章目录 千锋Django学习笔记 写在前面 1. MVC和MTV 2. Django简介 3. MTV简单流程 4. 和Model的简单对接 5. Model 6. Tem ...
- Django学习笔记(五)
Django学习笔记(五) MVC和MTV对比 传统的MVC(Model-View-Controller) M 模型层,主要是对数据库层的封装 V 视图层,向用户展示结果 C 控制层,用于请求,获取数 ...
- 尚学堂Java学习笔记
尚学堂Java学习笔记 ============================ J2SDK&JRE J2SDK:JAVA2 SOFTWARE DEVELOPMENT KIT JRE:JAVA ...
最新文章
- 经典算法书籍推荐以及算法书排行【算法四库全书】
- 学习完Ajax的总结
- pc站转手机站的首页(扫二维码)
- linux启动phpstudy,phpstudy启动不了解决方法
- 【转】C#格式化字符串
- 乐鑫代理启明云端分享|ESP32驱动1.54inch(240*240)彩屏
- 《Power Designer系统分析与建模实战》——2.1 需求模型简介
- 【Linux】Linux的常用远程工具
- 如果你负债累累,上班已经不能还账,又没有创业资金,该怎么办?
- 公众号抢号_公众号调性是什么意思?公众号排版可以塑造公众号调性吗?
- python儿童入门视频-老男孩Python视频教程全套完整版!无偿分享~
- 一笔四线连9点你可以吗
- linux中bash命令是什么,linux中bash是什么意思?
- icon 的css,【iview】icon样式
- 【参会指南】PPP全球数字资产投资峰会之金融科技区块链支持可持续发展
- android widget的中文文档
- 我最近在看什么——《蛤蟆先生去看心理医生》
- java限流器简单实现
- java购物车的实现并发控制_购物车的实现原理
- 如何在IDEA中创建web项目并且部署到Tomcat中
热门文章
- python出现‘int‘ object is not iterable的解决办法
- CSDN博客首行空两格
- Audition CC Mac(ancc2019直装版)
- 核密度函数详解,核密度函数图如何看?
- 因数个数函数与因数和函数
- GKCTF 2021]excel 骚操作
- DisplayPort--Link training之Clock Recovery (CR)
- 【风控模型方法论】利用系数符号、VIF和IV快速挑选模型变量
- 【采用】互联网金融反欺诈体系构建及典型应用案例
- Android -- MediaRecorder录制短视频