一、初识 Django

一、引子

Django最初设计用于具有快速开发需求的新闻类站点,目的是要实现简单快捷的网站开发!

从好的方面来看,Web 开发激动人心且富于创造性;从另一面来看,它却是份繁琐而令人生厌的工作。通过减少重复的代码,Django 使你能够专注于 web 应用上有 趣的关键性的东西。为了达到这个目标,Django 提供了通用Web开发模式的高度抽象,提供了频繁进行的编程作业的快速解决方法,以及为“如何解决问题”提供了清晰明了的约定。同时,Django 尝试留下一些方法,来让你根据需要在framework之外来开发。

二、设计模型

Django无需数据库就可以使用,它提供了对象关系映射起(ORM)。通过此技术,你可以使用Python代码来描述数据库结构。

数据模型语法提供了很多方法来描述你的数据,这解决了多年来数据库模式中的难题。以下是一个简明的例子:

# mysite/news/models.py
from django.db import models
class Reporter(models.Model):
    full_name = models.CharField(max_length=70)
    def __str__(self):              # Python 2 下请使用 __unicode__
        return self.full_name
class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    reporter = models.ForeignKey(Reporter)
    def __str__(self):              # Python 2 下请使用 __unicode__
        return self.headline

二、创建模型

运行Django命令行工具来创建数据库表。

$ python manage.py migrate

migrate命令会查找所有可用的模型,如果数据库中没有与之对应的表,则会为其自动创建。Django提供了其他更丰富的方式。

三、享用便捷的API

现在可用使用一套便捷而丰富的Python API用语访问你的数据。这些API是自动即创建的,你不用编写其他任何代码。

# 从我们的 news 应用里导入模型(译注:记者和文章模型)。
>>> from news.models import Reporter, Article
# 现在系统中还没有记者。
>>> Reporter.objects.all()
<QuerySet []>
# 创建一个 Reporter 对象。
>>> r = Reporter(full_name='John Smith')
# 将对象保存到数据库。save()方法需要被显式调用。
>>> r.save()
# 现在它有了id。
>>> r.id
1
# 现在这个新人记者已经在数据库里了。
>>> Reporter.objects.all()
<QuerySet [<Reporter: John Smith>]>
# 字段被表示成 Python 对象中的属性。
>>> r.full_name
'John Smith'
# Django 提供了一套丰富的数据库查找 API。
>>> Reporter.objects.get(id=1)
<Reporter: John Smith>
>>> Reporter.objects.get(full_name__startswith='John')
<Reporter: John Smith>
>>> Reporter.objects.get(full_name__contains='mith')
<Reporter: John Smith>
>>> Reporter.objects.get(id=2)
Traceback (most recent call last):
  ...
DoesNotExist: Reporter matching query does not exist.
# 创建一篇文章。(译注:reporter放入了前面创建的r对象)
>>> from datetime import date
>>> a = Article(pub_date=date.today(), headline='Django is cool',
...     content='Yeah.', reporter=r)
>>> a.save()
# 现在文章在数据库里了。
>>> Article.objects.all()
<QuerySet [<Article: Django is cool>]>
# 通过 Article 对象可以访问与其关联的 Reporter 对象。
>>> r = a.reporter
>>> r.full_name
'John Smith'
# 反之亦然:Reporter 对象也可以访问到与其关联的 Article 对象。
>>> r.article_set.all()
<QuerySet [<Article: Django is cool>]>
# 这个 API 接受你所需的查询条件,并在后台高效地执行 JOIN 数据库操作。
# 这个操作会查找所有以 "John" 开头的记者发表的文章。
>>> Article.objects.filter(reporter__full_name__startswith='John')
<QuerySet [<Article: Django is cool>]>
# 通过变更对象的属性值来修改对象,然后调用save()存入数据库。
>>> r.full_name = 'Billy Goat'
>>> r.save()
# 用 delete() 来删除一个对象。
>>> r.delete()

四、动态生成的管理页面:并非徒有其表

当你的模型完成定义,Django就会自动生成一个专业的生产级的管理页面,一个可用让已认证用户进行添加,更改和删除对象的Web站点,那你只需要简单的在admin站点注册你的模型即可。

# mysite/news/models.py
from django.db import models
class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
# mysite/news/admin.py
from django.contrib import admin
from . import models
admin.site.register(models.Article)

这样设计所遵循的理念是,站点编辑人员可以是你的员工,你的客户,或者就是你自己--而你大概不会乐意费半天劲创建一个只有内容管理工具的后台管理界面。

创建Django应用的典型流程是:先建立数据模型,然女孩搭建管理站点,尽可能快的跑起来。那样你的团队(或者客户)就可以向你的网站里填充数据了。??

五、规划URL

简洁优雅的URL规划对于一个高质量Web应用来说职官重要。Django推崇优美的URL设计,所以不要诸如 .php 和 .asp 之类的冗余的后缀放到 URL 里。

为了设计你自己的URL,你需要创建一个叫做URLconf的Python模块。一张包含URL匹配模型和Python回调函数之间的映射表。

URLconf 也有利于将 Python 代码与 URL 解耦合(译注:使各个模块分离,独立)。

下面这个URLconf适用于前面Reporter/Article的例子:

# mysite/news/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^articles/([0-9]{4})/$', views.year_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

上面的代码将URL的正则表达式映射到views里的回调函数。正则表达式通过括号来提取URL中的参数值。当一个用户请求页面时,Django会顺序遍历这些匹配模式,直至模式和请求的URL成功匹配(如果全部模式都无法匹配,Django会返回404视图。)这个过程会在顺时间完成,因为这些正则表达式在启动时就被编译了。

一旦其中一个正则表达式匹配成功,Django就会导入并调用指定的视图--那是一个简单的Python函数。视图会被传进一个请求(requeset)对象--其中包含了请求数据--和正则表达式匹配到的那些参数值。

比如,如果用户请求了"articles/2018/06/9081580" 这样的URL,Django就会这样调用函数:news.views.article_detail(request, ‘2018’, ‘06’, ‘9081580’)。

六、编写视图

视图函数的执行结果只可能有两种:返回一个包含请求页面内容的HttpResponse对象;或者是抛出Http404 这类异常。至于视图接下来还要做什么则由你决定。

通常来说,一个视图的工作就是:从参数获取数据,加载模版,然后模版进行带数据的渲染。下面是一个year_archive 的视图例子:

# mysite/news/views.py
from django.shortcuts import render
from .models import Article
def year_archive(request, year):
    a_list = Article.objects.filter(pub_date__year=year)
    context = {'year': year, 'article_list': a_list}
    return render(request, 'news/year_archive.html', context)

七、设计模板

上面的代码加载了 news/year_archive.html 这个模板。

Django允许设置搜索模版路径,这样可以最小化模版之间的冗余。在Django设置中,你可以通过DIRS参数指定目录列表来检索模版。如果模版不在第一个目录中,就继续检查第二个,以此类推。

比如news/year_archive.html 模板找到了,它可能是这样的:

# mysite/news/templates/news/year_archive.html
{% extends "base.html" %}
{% block title %}Articles for {{ year }}{% endblock %}
{% block content %}
<h1>Articles for {{ year }}</h1>
{% for article in article_list %}
    <p>{{ article.headline }}</p>
    <p>By {{ article.reporter.full_name }}</p>
    <p>Published {{ article.pub_date|date:"F j, Y" }}</p>
{% endfor %}
{% endblock %}

变量都被双花括号括起来了。 {{ article.headline }} 的意思是“输出 article 的 headline 属性值”。这个“点”不止用于查找属性,还可以查找字典键值、索引和函数调用。

注意:{{ article.pub_date|date:”F j, Y” }}使用了 Unix 风格的“管道符”(“|”字符)。这是一个模板过滤器,用于过滤变量值。在这里过滤器将一个 Python datetime 对象转化为指定的格式(就像 PHP 中的日期函数那样)。

你可以将多个过滤器连在一起使用。你还可以自定义模板过滤器。你甚至可以自定义模板标签,相关的 Python 代码会在使用标签时在后台运行。

Django 使用了“模板继承”的概念。这就是 {% extends “base.html” %} 的作用。它的含义是“先加载名为 base 的模板作为基类,并且用下面的标记块对模板中定义的标记块进行填充”。简而言之,模板继承可以使模板间的冗余内容最小化:每个模板只需包含与其他文档有区别的内容。

下面是 base.html 可能的样子,它使用了静态文件:

# mysite/templates/base.html
{% load static %}
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <img src="{% static "images/sitelogo.png" %}" alt="Logo" />
    {% block content %}{% endblock %}
</body>
</html>

简而言之,它定义了这个网站的外观(还有网站的logo),并且给予模版们挖好了可以填的坑。这也让网站的改版变得简单无比--你只需要改这个base基类模版文件即可。

它也可以用来创建网站的多个版本多个基类模板可以重用同一套子模板。Django 的创始人就用这种技术建立了网站的移动端适配版——只需建立一个新的基类模板。

注意,你并不是非得使用 Django 的模板系统,你可以使用其他你喜欢的模板系统。尽管 Django 的模板系统良好地集成了模型层,但这不意味着你必须使用它。同样,你可以不使用 Django 的数据库 API。你可以用其他的数据库抽象层,像是直接读取 XML 文件,亦或直接读取磁盘文件,你可以使用任何方式。Django 的任何组成——模型、视图和模板——都是解耦的。

原文地址:https://www.cnblogs.com/baishuchao/p/9240914.html

时间: 2024-10-22 21:05:32

一、初识 Django的相关文章

初识Django —Python API接口编程入门

初识Django -Python API接口编程入门 一.WEB架构的简单介绍 Django是什么? Django是一个开放源代码的Web应用框架,由Python写成.我们的目标是用Python语言,基于Django框架,利用MVC模型,实现后台方面的针对数据库的API开发.先了解一下互联网的WEB架构, 如上图: 互联网的WEB架构大致分为三层,web层.app层和数据库层.Web层:如apache网站服务器:app层主要是应用业务:DB指后台数据库.随着互联网的高速发展,网站访问量的增长.数

Django学习手册 - 初识django

初识: django简介: 开放源代码的web应用框架 由python语言编写的. 一.框架基本概念(核心): 以上这个图就是 django 的核心逻辑图,必须熟记.后续的所有编程都跟这个图的逻辑息息相关. 二.MVC/MTV 是啥子? MVC:全名Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交

初识Django

参考书目:Django Web开发指南,Django官方文档 环境Windows 8 x64 ,python2.7.9 x32,Django1.8.1 因为书中的Django版本似乎是比较老的了,所以这里我参考了官方在线文档完成书中的相关部分,下面记录的就是书中代码在新版中的实现. 1.安装等略 2.新建一个项目project 新建立的项目结构如下: 3.数据库连接 4.启动Django开发环境的测试服务器: 在浏览器地址栏输入 http://127.0.0.1:8000/来测试是否成功 在ru

python——初识django的template

这周听了老师讲关于django的框架问题,第一次比较透彻的了解了mtv框架.也是第一次接触模板的概念,研究了一下,现在就记录下来好嘞... 首先要介绍一点关于django的模板:我们为什么要使用模板呢?之前我已经知道django可以将前端需要的数据在后台进行处理之后返回给前端,但是如果任何页面的改动会牵扯到Python代码的改动,网站的设计改动会比Python代码改动更频繁,所以如果我们将两者分离开会更方便,templates的概念就这样应运而生. 下面先记录一个简单的例子: 上面就是全部的代码

初识django之orm布置与增删改查

1.数据库驱动:给database--->data source下载对应数据库的驱动. 2.数据库工具包:py2.0支持MySQLdb(),但是py3中MySQLdb()已经不能完全适用,需要置换,毕竟orm底层上还是基于关于数据库操作的py工具包,请先确保已经下载好了pymysql,在项目文件夹下的__init__.py下添加: import pymysql pymysql.install_as_MySQLdb() 3.数据库连接设置:在settings.py里配置数据库连接信息:DATABA

初识django安装

1.创建虚拟环境 mkvirtualenv -p /usr/bin/python3.6  name(需要创建的虚拟环境名字) 2.安装django pip install django  (此安装未指定版本,默认安装最新版本) 3.创建第一个django项目 利用代码进行创建项目:django-admin startprojcet  name(创建的项目名称) 4.创建第一个app 利用代码进行创建app:python manage.py startapp appname(创建的app名称) 原

初识 Django

啥是DNS DNS是域名解析系统,当我们通过浏览器发送如“ baidu.com” 时会先发送给本地DNS,没有找到的话会再发送到根服务器,世界上一共有13台根服务器, 10台在美国,两台在欧洲,一台在日本.这不是重点,根服务器会拿到我们发的请求时,会解析后面的.com部分,发送信息给 管理.com的顶级服务器中去查找,再通过.com顶级服务器找到管理baidu.com的权威服务器,返回一个ip和端口给本地DNS,本地会记录下来IP地址并访问www.baidui.com. DNS就是记录着域名和i

初识DJango框架

小白必会三板斧 HttpResponse:返回字符串 render:返回HTML页面 redirect:重定向 静态文件配置 什么是静态文件 网站所用到的 自己写好js 自己写好css 第三方的框架 bootstrap.fontwesome.sweetalert 通常情况下 网站所用到的静态文件资源 统一都放在static文件夹下 STATIC_URL = '/static/'是访问静态资源的接口前缀,也就是说,'/static/'就像一个令牌,只要是去访问静态资源,就必须先经过'/static

django安装与简介

一.初识Django自称MTV框架.和传统的MVC大同小异.M指数据模型(Model),T指模板(Template),用来描述数据的展现.V指的是视图(View),并且,在Django中可以通过URL分发器对URL和View之间的映射进行配置,而View则URL分发器回调启动server python manage.py runserver可以更改本地端口:python manage.py runserver 8080还可以设置成允许公开的互联网连接python manage.py runser