python django框架学习笔记(二)--mtv开发模式
一、django的MTV模式
django的MTV模式本质上和MVA一样,为了各组件间保持松耦合关系,只是定义上有些不同。
M代表模型(Model):负责业务对象和数据库的关系映射(ORM)
T代表模版(Template):负责如何把页面展示给用户(html)
V代表视图(VIEW):负责业务逻辑,并在适当时候嗲用Model和Template.
除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的VIEW处理,VIEW再调用相应的Model和Template.
MTV模式处理情况大致如下:
1、web服务器(中间件)收到一个http请求。
2、Django在URLconf里查找对应的视图(view)函数来处理http请求。
3、视图函数调用相应的数据模型来存取数据、调用相应的模版向用户展示页面
4、视图函数处理结束后返回一个http的响应给WEB服务器
5、WEB服务器将响应发送 给客户端。
django中 MTV对应的文件组织:
二、url.py详解:
url.py:URL分发器(路由配置文件)。
1、urlpatterns:
2、URL模式:
urlpatterns = [
url(正则表达式,view函数,参数,别名,前缀)
]
参数说明:
一个正则表达式字符串
一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
可选的要传递给视图函数的默认参数(字典格式)
一个可选的name参数
路径前缀
3、URL分解器,include函数:
通常一个URL分解器对应一个URL配置模块,他可以包含多个URL模式,也可以包含多个其他URL分解器。通过这种包含结构设计,实现Django对URL的层级解析。
url分解器是Django实现APP与项目解耦的关键,通常由include方法操作的url配置模块,最终会被解释成为URL分解器。
4、URL常见写法实例,正则表达式
url(r'^test/\d{2}/$',views.test)
url(r'^test/(?P<id>\d{2})/$',view.test)
url(r'^test2/(?P<id>\d{2})/(?P<key>\w+)/$',view.test)
三、views.py
http请求:HttpRequest
http响应:HttpResponse
所在位置:django.http
(1)、HttpRequest:具体方法请查看手册
(2)、HttpResponse:具体方法请查看手册
对于HttpRequest对象来说,是由Django自动创建,但是HttpResponse对象必须我们自己创建。每个View方法必须返回一个HttpResponse对象
HttpResponse类在django.http.HttpResponse
构造HttpResponse:
response = HttpResponse("Here's the text of the web page.") response = HttpResponse("Text only,please",,mimetype="text/plain")
四、数据库配置
django默认支持sqlite、mysql、oracle、postgresql数据库。具体见:https://docs.djangoproject.com/en/1.9/ref/databases/
这里我们还是以mysql为主,引擎名称:django.db.backends.mysql
mysql驱动程序:
MySQLdb(mysql-python):http://pypi.python.org/pypi/MySQL-pysthon/1.2.5
mysqlclient:http://pypi.python.org/pypi/mysqlclient
Connector/Python:http://dev.mysql.com/downloads/connector/python
PyMySQL(纯python的mysql驱动):http://pypi.python.org/pypi/PyMySQL
pymysql使用:
1、安装pymysql
2、修改配置文件
在settings.py中配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'django_db', 'USER':'root', 'PASSWORD':'123456', 'HOST':'localhost', 'PORT':'3306' } }
3、在工程目录的__init__.py中增加代码:
import pymysql pymysql.install_as_MySQLdb()
4、OK,我们在mysql中新建我们指定的库,然后回来同步下数据库。在pycharm中Tools下运行:
OK,查看数据库,我们的数据库同步完成。
五、ORM
对象关系映射(ORM),用于实现面对独享编程语言里不同类型系统的数据之间的转换。采用面对对象方式去操作数据库的创建表、增加、修改、删除、查询等操作。
六、models.py - 模型类的定义
一、创建数据模型。
#coding:utf-8 from __future__ import unicode_literals from django.db import models from django.db import models # Create your models here. class Publisher(models.Model): name = models.CharField(max_length=30) address = models.CharField(max_length=50) city = models.CharField(max_length=60) state_province = models.CharField(max_length=30) country = models.CharField(max_length=50) website = models.URLField() class Author(models.Model): name = models.CharField(max_length=30) class AuthorDetail(models.Model): sex = models.BooleanField(max_length=1,choices=((0,'男'),(1,'女'),)) email =models.EmailField() address = models.CharField(max_length = 50) birthday = models.DateField() author = models.OneToOneField(Author) class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField()
我们来看看上面的代码:
1、每个数据模型都是django.db.models.Model的子类。它的父类Model包含了所有的必要的和数据库交互的方法,并提供了一个简洁漂亮的定义数据库字段的语法。
2、每个模型相当于旦哥数据表库()这条规则的例外情况是多对多的关系,多对多关系的时候会多生成一张关系表),每个属性也是这个表中的一个字段。属性名就是字段名,它的类型(例如:CharField)相当于数据库的字段类型(例如:varchar). 大家可以留意其他的类型都和数据库里面什么字段类型对应。
3、模型之间的三种关系:一对一(OneToOneField),一对多(ForeignKey)和多对多(ManyToManyField).
4、模型的常用字段类型
BooleanField:布尔类型字段
CharField:字符串类型字段
DateField:日期字段
DateTimeField:日期时间字段
DecimalField:(精确)小数字段
EmailField:文件字段(保存和处理上传的文件)
FileField:文件字段
FloatField:(浮点数)小数字段
ImageField:图片字段(保存和处理上传的图片)
IntegerField:整数字段
IPAddreessField:IP字段
SmallIntegerField:小整数字段
TextField:文本字段
URLField:网页地址字段
5、模型常用的字段选项
(1)、null(null = True|False)
数据库字段的设置是否可以为空(数据库进行验证)
(2)、blank(blank = True|False)
字段是否为空django会进行校验(表单进行验证)
(3)、choices :轻量级的配置字段可选属性的定义
(4)、default :字段的默认值
(5)、help_text:字段文字帮助
( 6 )、primary_key(=True|False)一般情况不需要进行定义是否主键,如果没有显示指定主键的话,django会自动增加一个默认主键 id = models.AutoField(primary_key=Ture)
(7)、unique:是否唯一,对于数据表而已
( 8 )、verbose_name:字段的详细民称,如果不指定该属性,默认使用字段的属性名称
官方文档:https://docs.djangoproject.com/en/1.9/ref/models/fields/
二、定义数据模型的扩展属性
通过内部类Meta给数据模型类增加扩展属性:
class Meta:
verbose_name = ‘名称’
verbose_name_plural = '名称复数形式'
odering = ['排序字段']
更多:https://docs.djangoproject.com/en/1.9/ref/models/options
三、定义模型的方法
定义模型的方法和普通python类方法没有太大差别,定义模型方法可以将前对应的数据,组装成具体的业务逻辑。
定义__unicode__()让对象有个默认的名字
(python2用__unicode__(),python3用__str__())
def __str__(self): return self.name