django的使用3-编写视图

[TOC] 编写视图 一个视图函数(或简称为视图)是一个 Python 函数,它接受 Web 请求并返回一个 Web 响应。这个响应可以是 Web 页面的 HTML 内容,或者重定向,或者404错误,或者 XML 文档,或一个图片…或是任何内容。视图本身包含返回响应所需的任何逻辑。这个代码可以存在任何地方,只要它在你的 Python 路径上就行。可以说,不需要其他东西,这里并没有魔法。为了将代码放置在某处,约定将视图放在名为 views.py 的文件里,这个文件放置在项目或应用目录里。 一个简单的视图 参考: https://docs.djangoproject.com/

February 12, 2017

django的使用3-URL调度器

[TOC] Django 允许你自由地设计你的URL,不受框架束缚。 概况 对于高质量的Web 应用来说,使用简洁、优雅的URL 模式是一个非常值得重视的细节。 为了给一个应用设计URL,你需要创建一个Python 模块,通常被称为URLconf(URL configuration)。这个模块是纯粹的Python 代码,包含URL 模式(简单的正则表达式)到Python 函数(你的视图)的简单映射。 映射可短可长,随便你。它可以引用其它的映射。而且,因为它是纯粹的Python 代码,它可以动态构造。 Django 如何处理一个请求 当一个用户请求Django 站点的一个页面,下面是Django 系统决定执行哪个Python 代码使用的算法: Django 确定使用根 URLconf 模块。通常,这是 ROOT_URLCONF 设置的值,但如果传入 HttpRequest 对象拥有 urlconf 属性(通过中间件设置),它的值将被用来代替 ROOT_URLCONF 设置。 Django 加载该 Python 模块并寻找可用的 urlpatterns 。它是 django.urls.path() 和(或) django.urls.re_path() 实例的序列(sequence)。 Django 会按顺序遍历每个 URL 模式,然后会在所请求的URL匹配到第一个模式后停止,并与 path_info 匹配。 一旦有 URL 匹配成功,Djagno 导入并调用相关的视图,这个视图是一个Python 函数(或基于类的视图 class-based view )。视图会获得如下参数: 一个 HttpRequest 实例。 如果匹配的 URL 包含未命名组,那么来自正则表达式中的匹配项将作为位置参数提供。 关键字参数由路径表达式匹配的任何命名部分组成,并由 django.urls.path() 或 django.urls.re_path() 的可选 kwargs 参数中指定的任何参数覆盖。 如果没有 URL 被匹配,或者匹配过程中出现了异常,Django 会调用一个适当的错误处理视图。 实例 下面是一个简单的 URLconf: ...

February 10, 2017

django的使用3-聚合

[TOC] 聚合 Django 数据库抽象 API 描述了使用 Django queries 来增删查改单个对象的方法。 然而,有时候你要获取的值需要根据一组对象聚合后才能得到。 模型示例: 作者,出版社,书,商店。 from django.db import models class Author(models.Model): name = models.CharField(max_length=100) age = models.IntegerField() class Publisher(models.Model): name = models.CharField(max_length=300) class Book(models.Model): name = models.CharField(max_length=300) pages = models.IntegerField() price = models.DecimalField(max_digits=10, decimal_places=2) rating = models.FloatField() authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE) pubdate = models.DateField() class Store(models.Model): name = models.CharField(max_length=300) books = models.ManyToManyField(Book) 常见的聚合查询 expressions output_field filter Avg Count Max Min Sum Variance: 返回给定表达式中数据的方差 StdDev: 返回给定表达式中数据的标准差 # Total number of books. >>> Book.objects.count() 2452 # Total number of books with publisher=BaloneyPress >>> Book.objects.filter(publisher__name='BaloneyPress').count() 73 # Average price across all books. >>> from django.db.models import Avg >>> Book.objects.all().aggregate(Avg('price')) {'price__avg': 34.35} # Max price across all books. >>> from django.db.models import Max >>> Book.objects.all().aggregate(Max('price')) {'price__max': Decimal('81.20')} # Difference between the highest priced book and the average price of all books. >>> from django.db.models import FloatField >>> Book.objects.aggregate( ... price_diff=Max('price', output_field=FloatField()) - Avg('price')) {'price_diff': 46.85} # All the following queries involve traversing the Book<->Publisher # foreign key relationship backwards. # Each publisher, each with a count of books as a "num_books" attribute. >>> from django.db.models import Count >>> pubs = Publisher.objects.annotate(num_books=Count('book')) >>> pubs <QuerySet [<Publisher: BaloneyPress>, <Publisher: SalamiPress>, ...]> >>> pubs[0].num_books 73 # Each publisher, with a separate count of books with a rating above and below 5 >>> from django.db.models import Q >>> above_5 = Count('book', filter=Q(book__rating__gt=5)) >>> below_5 = Count('book', filter=Q(book__rating__lte=5)) >>> pubs = Publisher.objects.annotate(below_5=below_5).annotate(above_5=above_5) >>> pubs[0].above_5 23 >>> pubs[0].below_5 12 # The top 5 publishers, in order by number of books. >>> pubs = Publisher.objects.annotate(num_books=Count('book')).order_by('-num_books')[:5] >>> pubs[0].num_books 1323 aggregate Django 提供了两种生成聚合的方法。第一种方法是从整个 QuerySet 生成汇总值。比如你想要计算所有在售书的平均价格。Django 的查询语法提供了一种用来描述所有图书集合的方法: ...

February 7, 2017

django的使用3-数据库抽象API

[TOC] 数据库抽象API 一旦创建数据模型后,Django 自动给予你一套数据库抽象 API,允许你创建,检索,更新和删除对象。下面介绍这些API。 先创建三个模型:博客,作者,记录 from django.db import models class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def __str__(self): return self.name class Author(models.Model): name = models.CharField(max_length=200) email = models.EmailField() def __str__(self): return self.name class Entry(models.Model): blog = models.ForeignKey(Blog, on_delete=models.CASCADE) headline = models.CharField(max_length=255) body_text = models.TextField() pub_date = models.DateField() mod_date = models.DateField() authors = models.ManyToManyField(Author) number_of_comments = models.IntegerField() number_of_pingbacks = models.IntegerField() rating = models.IntegerField() def __str__(self): return self.headline 创建新数据 一个模型类代表一张数据表,一个模型类的实例代表数据库表中的一行记录。要创建一个对象,用关键字参数初始化它,然后调用 save() 将其存入数据库。 ...

February 5, 2017

django的使用2-模型

[TOC] 模型 模型准确且唯一的描述了数据。它包含您储存的数据的重要字段和行为。一般来说,每一个模型都映射一张数据库表。有如下几个点: 每个模型都是一个 Python 的类,这些类继承 django.db.models.Model 模型类的每个属性都相当于一个数据库的字段。 利用这些,Django 提供了一个自动生成访问数据库的 API; example 定义了一个 Person 模型,拥有 first_name 和 last_name: from django.db import models class Person(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) first_name 和 last_name 是模型的 字段。每个字段都被指定为一个类属性,并且每个属性映射为一个数据库列。 上面的 Person 模型会创建一个如下的数据库表: CREATE TABLE myapp_person ( "id" serial NOT NULL PRIMARY KEY, "first_name" varchar(30) NOT NULL, "last_name" varchar(30) NOT NULL ); 该表的名称规则 myapp_person = app名称_class名称,可修改。 id 字段会被自动添加,可修改。 创建数据表的语法是根据配置文件setting.py中设置的数据类型来定。 字段类型 模型中每一个字段都应该是某个 Field 类的实例, Django 利用这些字段类来实现以下功能: ...

February 1, 2017

django的使用1-简介

[TOC] 简介 Django 是一个用python语言写的web开发框架,最初被设计用于具有快速开发需求的新闻类站点,目的是要实现简单快捷的网站开发。 著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层;他们之间以一种插件似的,松耦合的方式连接在一起。 模型负责业务对象与数据库的对象(ORM),视图负责与用户的交互(页面),控制器(C)接受用户的输入调用模型和视图完成用户的请求。 Django的MTV模式本质上与MVC模式没有什么差别,也是各组件之间为了保持松耦合关系,只是定义上有些许不同,Django的MTV分别代表: Model(模型):负责业务对象与数据库的对象(ORM) Template(模版):负责如何把页面展示给用户 View(视图):负责业务逻辑,并在适当的时候调用Model和Template 此外,Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template Django安装与基本使用 Django安装 pip install django 创建项目 django-admin startproject your-project-name # example ----------------------------------------------------------- (dj) alex@Alex:~/github$ django-admin startproject my_project (dj) alex@Alex:~/github$ tree my_project my_project ├── manage.py └── my_project ├── asgi.py ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py 这些目录和文件的用处是: manage.py: 一个让你用各种方式管理 Django 项目的命令行工具 my_project/ 目录包含你的项目,它是一个纯 Python 包。它的名字就是当你引用它内部任何东西时需要用到的 Python 包名。 my_project/init.py:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。 my_project/settings.py:Django 项目的配置文件。 my_project/urls.py:Django 项目的 URL 声明,路由配置。 my_project/asgi.py:作为你的项目的运行在 ASGI 兼容的 Web 服务器上的入口。 my_project/wsgi.py:作为你的项目的运行在 WSGI 兼容的Web服务器上的入口。 创建应用 python manage.py startapp app01 # example ----------------------------------------------------------- (dj) alex@Alex:~/github$ cd my_project (dj) alex@Alex:~/github/my_project$ ls manage.py my_project (dj) alex@Alex:~/github/my_project$ python manage.py startapp app01 (dj) alex@Alex:~/github/my_project$ tree . ├── app01 │ ├── admin.py │ ├── apps.py │ ├── __init__.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ └── views.py ├── manage.py └── my_project ├── asgi.py ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py 启动项目 python manage.py runserver # example ----------------------------------------------------------- (dj) alex@Alex:~/github/my_project$ python manage.py runserver Watching for file changes with StatReloader Performing system checks... Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. 这里省略了host 和port的设置。python manage.py runserver 0.0.0.0:8000 ...

January 30, 2017