其实一开始接触Django我是拒绝的,因为它主要用于写Web后端。而Web后端已经有了PHP的Laravel和Java的Spring,用它们我能迅速的完成公司的要求,那么这个Django有什么值得我们要去学的呢?
一、给我一个用Django的理由
- 项目需要和机器学习的某框架对接。
- 有Python相关人才,没有PHP/Java人才。
- 用框架开发,速度快。
二、快速上手 & 框架说明
如果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. 密码加密:
现在一般认为安全的“加盐密码加密”流程是这样的:
- 生成一个随机salt(大于16位)
- 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")
Comments | NOTHING