从 3 月 1 号到 3 月 23 号总共 24 天完成了三个项目, 时间很赶, 学的很充实, 但是憋的有点难受了, 从下周开始就有上机实验了, 抽不出来很多时间学课外的东西了. 任务进度拖延了一个星期的进度, 主要是因为我懒..... 这一方面需要进一步改进. 学习资源来自:
http://www.conyli.cc/archives/category/program/django
Ps: 翻译这本书的大佬夸奖我了:
书的目录结构如下:
第一章, 创建一个博客应用, 通过创建一个博客应用来给你介绍这个框架. 你将会创建基础的博客 models,views,templates 以及 URLs 来展示博客文章. 你将学习如何使用 Django ORM 来创建 QuerySets, 并且你将配置 Django 的管理后台.
第二章, 通过高级特性来增强你的博客交道你如何操控表单和 model 表单, 通过 django 发送电子邮件, 并且集成第三方的应用. 你将给你的博客文章实现一个评论系统并且运行你的用户通过电子邮件来分享文章. 这一章还引导你如何创建一个标记系统.
第三章, 扩展你的博客应用, 探讨如何常见自定义的 template tags 和 filters. 这一章还展示给你如何使用站点地图框架以及给你的文章创建一个 RSS 订阅. 你将通过构建一个搜索引擎, 由 PostgreSQL 提供的全文本搜索功能支持来完善你的博客应用.
第四章, 构建一个社交网站, 说明如何构建一个社交网站. 你将会使用 Django 的认证框架去创建用户账户 views. 你将学习到如何创建一个自定义的用户身份 model 以及构建社交认证到你的项目中通过各类大型社交网络 (例如通过 Facebook,google 啥账号进行登录). 第五章, 在你的网站中分享内容, 教导你如何转换你的社交应用成为一个图片书签站点. 你将给 models 定义多对多的关系, 并且你将使用 JavaScript 创建一个 Ajax 书签并且集成它到你的项目中. 这一章给你展示了如何生成图片缩微图以及给你的 views 创建自定义的装饰器.
第六章, 跟踪用户行为, 给你展示如何给用户们构建一个关注电站系统. 你将通过创建用户动作流应用来完善你的图片书签站点. 你将学习如何优化 QuerySets, 并且你将使用
signals 的功能. 你将集成 Redis 到你的项目中来统计图片的浏览次数.
第七章, 创建一个在线商城, 探讨如何创建一个在线商城. 你将构建目录 models, 并且你将使用 Django sessions 来创建购物车. 你将给购物车构建一个上下文处理器, 并且你将学习如何使用 Celery 来给用户发送异步的消息通知.
第八章, 管理支付和订单, 探讨如何集成搞一个支付网关到你的商店中. 你还将定制管理后台来导出订单为 CSV 文件, 并且你将动态生成 PDF 发票.
第九章, 扩展你的商店, 教导你如何创建一个优惠系统来给订单进行打折处理. 这一章给你展示如何给你的项目添加国际化以及如何翻译 models. 你还将使用 Redis 来构建一个自动推荐引擎.
第十章, 构建一个在线学习平台, 引导你创建一个在线学习平台. 你将给你的项目添加 fixtures, 通过集成 model, 创建自定义的 model 字段, 使用基于类的 vies, 并且管理用户组合权限. 你将创建一个内容管理系统以及操作表单集.
第十一章, 渲染和缓存内容, 给你展示如何创建一个学生注册系统以及在培训课程上管理学生的报名. 你将渲染各种各样的培训内容以及你将学习如何使用缓存框架.
第十二章, 构建一个 API, 探讨给你的项目构建一个 RESTful API 通过使用 Django REST 框架.
第十三章, 上线, 展示如何在生产环境中使用 uWSGI 和 NGINX, 并且采用更安全的 SSL(也就是 https). 这一章说明如何构建一个自定义的中间件以及创建自定义的管理命令
书的大体架构来自如下:
图片来自:
https://blog.csdn.net/hawk_2016/article/details/84103613#commentsedit
前三章是一个博客项目:
这个博客项目是最顺利的一个项目, 或许是因为之前敲过一个博客项目的缘故吧,(自己的
网站还没备案... 哭了, 超期快一个月了), 但还是遇到了一些问题, 最大的问题就是
SMTP 邮箱关联的时候.
代码如下:
- def post_share(request,post_id):
- #通过 id 获取 post 对象
- post=get_object_or_404(Post,id=post_id,status="published")
- sent=False
- if request.method=="POST":
- #表单被提交
- form =EmailPostForm(request.POST)
- if form.is_valid():
- #验证表单数据
- cd=form.cleaned_data
- #发送邮件
- post_url=request.build_absolute_uri(post.get_absolute_url())
- subject='{},({})recommends you reading"{}"'.format(cd['name'],cd['email'],post.title)
- message='Read"{}"at {}\n\n{}\'s comments:{}'.format(post.title,post_url,cd['name'],cd['comments'])
- send_mail(subject,message,'zhuo521@126.com',[cd['to']])
- else:
- form = EmailPostForm()
- return render(request, 'blog/post/share.html', {'post': post, 'form': form, 'sent': sent})
setting 配置:
- EMAIL_USE_SSL = True
- EMAIL_HOST = 'smtp.126.com' # 如果是 163 改成 smtp.163.com
- EMAIL_PORT = 465
- EMAIL_HOST_USER = 'zhuo521@126.com' # 帐号
- EMAIL_HOST_PASSWORD = '******' # SMTP 密码
- DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
在此需要说一句, python 的 Django 后台系统是真的好用, 简单的配置就能够实现一个强大的后台系统.
第二个项目: 是一个简单的社交网站
这个项目可能是拖延的时间太长了, 导致 makemigratons 的时候新的项目无法创建, 怎么
配置也没配置好, 耽误了一下午, 一气之下, 直接 python,annoconda,pycharm 全部卸
载, 重新安装, 这样就好了.
django 自带的后台验证模板是真的好用, 太好用了, 解放生产力啊, 提高效率.
- <div class="login-form">
- <form action="{% url'login'%}" method="post">
- {{ form.as_p }}
- {% csrf_token %}
- <input type="hidden" name="next" value="{{ next }}">
- <p><input type="submit" value="Log-in"></p>
- </form>
- </div>
next 的功能是一个栈, 返回登陆之前的页面.
setting 的配置如下:
- LOGIN_REDIRECT_URL = 'dashboard' #如果没有指定 next 参数, 登录成功后重定向的 URL
- LOGIN_URL = 'login' #用户没有登录被强制重定向到的 URL 地址 (login 为 path 指定的 name 参数)
- LOGOUT_URL = 'logout' #用户需退出时强制重定向到的 URL 地址
还有一个问题就是自媒体文件的上传, 一定要配置流媒体
方法一:
在 urls.py 的最后加入这一句:
- if settings.DEBUG:
- urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
方法二:
在 urls.py 加入这一句:
- if settings.DEBUG:
- urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
图片上传步骤如下:
1, 模型中图片字段设置:
- MEDIA_URL = '/media/'
- MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
- photo = models.ImageField(upload_to='user/%Y/%m/%d/', blank=True)
必须安装 Python 的 Pillow 库才能使用图片文件字段, 同时在 settings 中设置:
upload_to: 指定上传后图片的 url.
2, 提交按钮设置
<form action="." method="post" enctype="multipart/form-data" novalidate>
enctype="multipart/form-data" 必须设置.
novalidate: 取消对表单的验证
Ajax 验证
- {% block domready %}
- $('a.like').click(function (e) {
- e.preventDefault();
- $.post('{% url'images:like'%}',
- {
- id: $(this).data('id'),
- action: $(this).data('action'),
- },
- function (data) {
- if (data['status'] === 'ok') {
- let previous_action = $('a.like').data('action');
- // 切换 data-action 属性
- $('a.like').data('action', previous_action === 'like' ? 'unlike' : 'like');
- // 切换按钮文本
- $('a.like').text(previous_action === 'like' ? 'Unlike' : 'Like');
- // 更新总的喜欢人数
- let previous_likes = parseInt($('span.count.total').text());
- $('span.count.total').text(previous_action === 'like' ? previous_likes + 1 : previous_likes - 1);
- }
- }
- );
- });
- {% endblock %}
这段代码的逻辑解释如下:
使用
$('a.like')
选择所有属于
like
类的 < a > 标签
给
<a>
标签绑定
click 事件, 每次点击就发送 Ajax 请求.
在事件处理函数内, 使用
e.preventDefault()
阻止 < a > 的默认功
能, 即阻止打开新的超链接
使用 $.post() 发送异步的 POST 请求. jQuery 还提供了 $.get() 用于发送异步的 GET 请求, 和一个更底层的 $.Ajax() 方法.
使用
{% url %} 反向解析出 Ajax 的请求目标地址
创建要发送的数据字典, 通过
<a>
标签的
dataid
和
dataaction
设置
id
和 action 键值对.
设置回调函数, 当成功收到 Ajax 响应时执行, 响应数据被包含在对象 data 中.
根据
data
中的
status
判断值是否为
ok, 如果是则切换 dataaction
和按钮文本.
根据刚才执行的结果, 对总喜欢人数增加 1 或者减少 1
signal 实现代码控制
Django 提供一个信号模块, 可以让 receiver 函数在某种动作发生的时候得到通知. 信号功能在实现每当发生什么动作就执行一些代码的时候很有用, 也可以创建自定义的信号用于通知其他程序
Django 在 django.db.models.signals 中提供了一些信号功能, 其中有如下
的信号:
pre_save 和 post_save, 在调用 save() 方法之前和之后发送信号 pre_delete 和 post_delete, 在调用 delete() 方法之前和之后发
送信号
m2m_changed 在多对多字段发生变动的时候发送信号
Redis 数据库
Redis 作为非关系型数据库, 有很大的用处, 存储结构为 key,value 集合的结构, 对于非规范性的的数据用处十分大. Redis 的数据处理方法非常多, 非常灵活, 忙完这段时间, 复习下爬虫, 复习下 Redis 吧, 不过至少也应该是半年之后了...
项目三: 电商项目
session 传值:
以前对 session 和 cookie 只有模糊的定义概念, 通过的这个项目, 初步掌握了 session 和 cookie 的用法, 作为 web 端, 传值是真的费劲. session 的跨域传值解决了这个问题.
同步和异步处理:
同步: 处理完程序才能获得结果
异步: 就算处理不完程序也可以去办一些其他的事情.
celery 异步管理和 rabbitmq 消息队列
貌似很有用, 具体的用法可待进一步探索.
目前还存在的问题:
1.weasyprint 的配置
配了一下午还是没配置成功, 直接放弃了, 以后再配一下吧.
2.Ajax 还不怎熟悉
3.session 的也不够熟悉
4. 下一步的学习安排存在一些犹豫
今天突然想起的一句话, 自渡者天渡之, 自厌者天厌之.
来源: http://www.bubuko.com/infodetail-2997824.html