开始使用Django

发布于 2017-11-01  6.33k 次阅读


其实一开始接触Django我是拒绝的,因为它主要用于写Web后端。而Web后端已经有了PHP的Laravel和Java的Spring,用它们我能迅速的完成公司的要求,那么这个Django有什么值得我们要去学的呢?

一、给我一个用Django的理由

  1. 项目需要和机器学习的某框架对接。
  2. 有Python相关人才,没有PHP/Java人才。
  3. 用框架开发,速度快。

二、快速上手 & 框架说明

如果E文可以的话,墙裂推荐看Django官方的“Writing your first Django app”系列:https://docs.djangoproject.com/en/1.11/intro/tutorial01/

1. 安装Django并创建第一个项目:

pip install django
django-admin startproject cheney-hello

就安装了django并创建了cheney-hello工程。

2. 启动內建服务器:

相信不少同学对Python一句话搭建http服务器(python -m SimpleHTTPServer 8080)印象挺深的吧,同样的Django也带了一个轻量的內建服务器,有自动监听文件变更并重启的功能,类似于NodeJS里的gulp-watch。

python manage.py runserver 0:8080

0:8080即绑定所有IP的8080端口

3. 修改urls.py,添加映射:

相比于laravel的router路由功能,python直接提供了较好的正则表达式的支持,所以路由规则映射可以更随心所欲了。例如:

urlpatterns = [
  url(r'^admin/', admin.site.urls),
  url(r'^$', cheney-hello.index),
  url(r'^article/(?P<essayName>\w+)/$', cheney-hello.article)
]

这样:

  • 访问"domain.com"时会转到cheney-hello.index
  • 访问"domain.com/article/name"时会转到cheney-hello.article,传一个参数essayName="name"。

4. 如何操控返回值:

Django通过django.http提供了以下操控HTTP响应的方法:

  • 渲染一个页面:render_to_response("x.html", {args:value})
  • 重定向到另一个页面:HttpRespnseRedirect("/")

一如既往的灵活。如果你想返回一个页面,那就渲染模板。如果你想返回一串JSON做前后端分离,那就返回。如果你想重定向,也一样,完全不需要多余的操作。

5. Django的模板引擎:

判断:

{% if not essay %}No essay provided!{% elif essay.readers <= 100  %}{{ essay.Name }}{% else %}{{ essay.Name }}|{{ essay.author }}{% endif %}

循环:

(% for article in articles %){{ article.name }}{% endfor %}

包含其他页面:

{% include 'nav.html' %}

扩展另一个页面:

{% extends 'base.html' %}

可扩展的块/填充可扩展的块:

{% block block111 %}{% endblock %}

例如,base.html:

<!DOCTYPE HTML>
<head>
<title>{% block title %}{% endblock %} - Cheney Hello</title>
</head>
{% block content %}
这里是默认内容,所有继承自这个模板的,如果不覆盖就显示这里的默认内容。
{% endblock %}

index.html:

{% extends 'base.html' %}
{% block title %}首页{% endblock %}

可以看到常用的模板功能都有。

6. 使用SQLite:

用了这么久MySQL了,不妨换个口味。Python自带了ORM(Object - Relation Mapping),如果你用过Laravel的ORM或者Java的Hibernate,那这个用起来就易如反掌了。

先创建一个django app:

python manage.py startapp cheney

然后编辑models.py,每个class对应一张表,class中的属性就是列。允许的数据类型有:

  • 字符:CharField(max_length=20, unique=True)
  • 文本域:TextField()
  • 数字:IntegerField(auto_created=True, unique=True, primary_key=True, default=0)
  • ...

例如:

from django.db import models
class Defect(models.Model):
  id= models.IntegerField(auto_created=True, unique=True, primary_key=True)
  defect = models.CharField(max_length=50)

为了能用代码管理数据库,聪明的人们发明了“数据库迁移”这么个思想。迁移的前提是数据库表是根据对象由ORM生成的。这样以后,每当有对象发生变更,我们就能生成相应的数据库变更语句,运行迁移语句就能把旧数据库迁移为新数据库。这样我们就能对数据库的变更历史进行版本控制与回滚操作了,也方便统一各个开发者的数据库版本。

要生成迁移语句,运行:

python manage.py makemigrations

然后执行迁移操作:

python manage.py migrate

7. SQLite的CRUD:

Django封装了它的CURD,但是有一些骚操作你得知道:

查询marker是xxx的所有条目:

Defect.objects.filter(marker=xxx)

排除defect是xx的所有条目:

Defect.objects.filter(marker=xxx).exclude(defect=xx)

计数:

Defect.objects.filter(marker=xxx).count()

查询marker是xxx或者xx的所有条目:

Defect.objects.filter(marker__in=["xx","xxx"])

想不到还有这种操作吧?

8. 密码加密:

现在一般认为安全的“加盐密码加密”流程是这样的:

  1. 生成一个随机salt(大于16位)
  2. salt和密码经过比较慢的hash运算后存入数据库

生成salt:

hashlib.sha256(str(random.random()).encode('utf-8')).hexdigest()
加密密码:
binascii.hexlify(hashlib.pbkdf2_hmac('sha256', password.encode('utf-8'), salt.encode('utf-8'), 100001)).decode("utf-8")
注意,如果没有最后的.decode("utf-8")你的密码可能会永远也验证不成功。