Python3 Django框架

一、Django基础

Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站!

Django的特点:

强大的数据库功能:拥有强大的数据库操作接口(QuerySet API),也能执行原生SQL

自带强大后台:网站拥有一个强大的后台,轻松管理内容

优雅的网址:用正则匹配网址,传递到对应函数,随意定义。

模版系统:易扩展的模版系统,设计简易,代码,样式 分开设计,更容易管理。

缓存系统:与memcached,redis等缓存系统联用,更出色的表现,更快的加载速度。

国际化:完全支持多国语言应用,允许定义翻译的字符,轻松翻译成不同国际的语言。

Django目录结构:

urls.py:网址入口,关联到对应的Views.py中的一个函数,访问网址对应的函数。

views.py:处理用户发出的请求,从urls.py中对应过来,通过渲染templates中的网页可以将显示内容,比如登陆后的用户名,数据,输出到网页。

models.py:与数据库操作相关,存入或读取数据时用到这个

templates文件夹:views.py中的函数渲染templates中的HTML模版,得到动态内容网页,可以用缓存来提高速度。
admin.py:后台,可以用很少量的代码就拥有一个强大的后台。

settings.py:Django的全局设置,配置文件,比如DEBUG的开关,静态文件的位置设置等。

二、Django安装

1、用pip来安装

(1)安装pip:yum install python-pip 或者https://bootstrap.pypa.io/get-pip.py 下载get-pip然后运行python get-pip.py就可以安装pip了;也可以下载pip源码包,运行python setup.py install 进行安装。

(2)利用pip安装Django

pip install Django 或者 pip install Django==2.0.4

升级pip可以用:pip install --upgrade pip

2、下载源码安装

linux and MAC:

下载源码包:https://www.djangoproject.com/m/releases/2.0/Django-2.0.4.tar.gz

tar -xvf django-2.0.4.tar.gz
cd django-2.0.4
python setup.py install

3、linux用自带源进行安装

ubuntu:
sudo apt-get install python-django -y
fedora:
yum install python-django -y

检查是否安装成功:看到版本号则安装成功!

>> import django
>> django.VERSION
(2, 0, 4, 'final', 0)
>> django.get_version()
'2.0.4'
image.png

三、Django基本命令

1.创建一个django项目

直接在终端输入:

django-admin startproject Hello

然后进入mysite这个文件目录,在终端输入:

 cd Hello/

查看目录有什么内容,在终端输入: ls
然后我们继续进入mysite这个目录在通过ls查看有什么内容。


image.png

看一下它的结构

Hello/
├── manage.py
└── Hello
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

Hello/ 根目录只是项目的容器,它的名字与Django无关,可以将它重命名为任何任何名字

manage.py:一个命令行实用程序,可让你以各种方式与Django项目进行交互

Hello:是项目的实际python包,它的名字是你需要用来导入任何内容的python包名

init.py:一个空文件,告诉python这个目录应该被视为一个python包

settings.py:这是Django项目的设置与配置,Django设置会告诉你有关设置如何工作的所有信息

urls.py:这是Django项目的URL声明

wsqi.py:WSGI兼容的Web服务器为你的项目提供服务的入口点

四、启动服务器

通过上面的操作我们已经创建好一个django项目了,我们回到最外层的mysite/这个目录,然后在终端输入:python manage.py runserver 启动服务器,成功后会出现下面的样子。

image.png

然后我们在浏览器访问http://127.0.0.1:8000/,会出现下面这个样子。

image.png

到现在为止我们已经成功新建了一个新的django项目,并且把它运行了起来。

创建一个应用

值得一提的是项目和应用的区别:一个应用是 Web 程序中的一个功能,比如博客应用,投票应用.一个项目是许多个基本应用的集合

直接在终端输入命令: python manage.py startapp staffadmin

成功创建staffadmin这个应用我们可以进入这个文件目录看下都有哪些文件。


image.png

admin.py:这个是配置管理后台数据.
models.py :这里面的每一个类,可以比喻成数据库的每一个表.
views.py :主要用作前后端交互。
urls.py:用作配置路由。

创建一个视图

打开staffadmin/views.py这个文件,写下如下代码


image.png

然后我们在staffadmin目录下新建一个urls.py,写下如下代码


image.png

同时还要配置一下Hello/urls.py,写下如下代码


image.png

然后我们通过浏览器访问http://127.0.0.1:8000/staffadmin/index

如果成功访问,会在浏览器看到"This is my first application"。


image.png

我们也可以在子文件夹Hello/下创建一个视图view.py


image.png

然后在Hello/下的urls.py里添加


image.png

然后访问127.0.0.1:8080,就可以看到hello world!了


image.png

也可以修改以下规则


image.png

然后访问127.0.0.1/hello,效果一样


image.png

五、配置数据库

我们打开Hello/Hello/settings.py这个文件。


image.png

我们可以看到熟悉的databases,默认配置的数据库是 SQLite,如果你想使用其它的数据库,需要在文件中的 DATABASES 'default' 改变适当的值。
比如我们想要连接mysql:


image.png

我们还可以通过这样修改时区和中文设置。


image.png

我们还可以看到INSTALLED_APPS有这些应用


image.png

在django中一些应用程序使用至少一个数据库表,因此我们需要在数据库中创建表,然后才能使用它们。

直接在终端输入命令:python manage.py migrate

image.png

创建模型


image.png

上面两个类相当于创建了两个表,类名代表表名,变量代表列名
激活模型

可以在INSTALLED_APPS里面加上'staffadmin'或者'staffadmin.apps.staffadminConfig'

image.png

经过上面的操作我们已经注册staffadmin这个应用了,因为我们之前对模型做了一些改变,并且你想要把这些改变保存为 migration。

直接在终端输入命令:python manage.py makemigrations staffadmin

image.png

如果我们想知道这个命令到底做了些什么,可以通过在终端直接输入命令: python manage.py sqlmigrate staffadmin 0001

image.png

熟悉数据库的同学一看就明白,这不就是创建数据库表的操作命令吗?没错的确如此。

然后我们还差最后一步就可以把数据库创建起来,

直接在终端输入命令: python manage.py migrate staffadmin

image.png

直到这一步,我们的数据库已经建好。现在我还要提醒的是,migrate 命令会执行所有还没应用的迁移,

并会在数据库中执行相应的代码来同步你的修改.迁移是一个非常强大且有用的工具,可以让你在开发项目的任何时候,

不需要对数据库进行删除增加等操作就完成修改,在升级数据库信息时也不会造成丢失.现在只需要记住以下这三个步骤:

如果修改了模型(在 models.py 文件中).
运行 python manage.py makemigrations来为这些修改创建迁移.
运行 python manage.py migrate 来应用这些改变到数据库.

image.png

操作数据库(models)

操作数据库无非就是增删改查。

首先我们在终端输入命令python manage.py shell,然后先把我们的数据库表引进来。

from staff.modles import Department

 models.Department.objects.create(department_name='市场部')  增加一条数据,可以接受字典类型数据 **kwargs

 obj = models.Department(department_name='市场部')
 obj.save()

 models.Department.objects.get(id=1)         # 获取id=1的单条数据,不存在则报错(不建议)
 models.Department.objects.all()               # 获取全部数据
 models.Department.objects.filter(department_name='市场部') # 获取department_name='市场部'的数据# models.Department.objects.exclude(department_name='市场部') # 获取除了department_name='市场部'的数据

 models.Department.objects.filter(department_name='市场部').delete() # 删除department_name='市场部'的数据

 models.Department.objects.filter(department_name='市场部').update(department_name='运营部')  # 将department_name="市场部"改成"运营部",均支持 **kwargs
 obj = models.Department.objects.get(id=1)
 obj.department_name= '运营部'
 obj.save()                                                 # 保存数据

当有一对多,多对一,或者多对多的关系的时候,先把相关的对象查询出来

image.png

image.png

在这里我提一下ForeignKey,ManyToManyField与OneToOneField分别是Model中定义多对一,多对多,一对一关系。
在本例的教程中,我们可以知道一个员工只有一个部门,一个部门可以有多个员工,所以用了ForeignKeyField

admin站点的使用

首先我们先创建一个超级用户的账号
直接在终端输入命令:python manage.py createsupperuser,然后根据提示输入相关内容即可。

image.png

此时我们可以通过浏览器访问http://127.0.0.1:8000/admin/,我们会看到下面的画面。

此时我们发现我们写的models没有显示出来,是因为没有在admin上面注册。

所以我们打开Hello/staffadmin/admin.py这个文件

然后我们把models引进来


image.png

保存代码,然后刷新浏览器我们发现多了一个staffadmin的管理组


image.png

然后看看其内容


image.png
image.png

这是我们刚才添加的信息

使用mysql数据库

与数据库的交互:

把数据存取逻辑、业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的 Model-View-Controller (MVC)模式。在这个模式中, Model 代表数据存取层,View 代表的是系统中选择显示什么和怎么显示的部分,Controller 指的是系统中根据用户输入并视需要访问模型,以决定使用哪个视图的那部分。

由于 C 由框架自行处理,而 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架 。在 MTV 开发模式中:

M 代表模型(Model),即数据存取层。该层处理与数据相关的所有事务:如何存取、如何确认有效性、包含哪些行为以及数据之间的关系等。

T 代表模板(Template),即表现层。该层处理与表现相关的决定:如何在页面或其他类型文档中进行显示。

V代表View,业务逻辑层。这一层包含访问模型的逻辑和按照模板显示。你可以认为它是模型和模板的桥梁。

上面的数据库用的是django自带的sqlite3,我们也可以使用更方便地mysql,首先配置文件中修改一下mysql配置,上面提到过
这里详细说一下mysql的方法,因为上面创建了一个staffadmin的app应用,这里我们新建一个应用----people

image.png
image.png

然后修改mysql配置,在我们的项目HELLO/Hello/setting.py中

image.png

修改对应的mysql数据库、用户、密码、端口
然后将我们新建的应用(people)添加到 settings.py 中的 INSTALLED_APPS中,也就是告诉Django有这么一个应用。


image.png

然后修改models.py
我们打开 people/models.py 文件,修改其中的代码如下:

from django.db import models

# Create your models here.
class Person(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()

    def __str__(self):
        return self.name

我们新建了一个Person类,继承自models.Model, 一个人有姓名和年龄。
也就相当于在mysql中创建了一个person表,然后里面的字段属性有年龄,名字等
在Django中使用该数据库布局的第一步是将其表述为Python代码。在通过“startapp”命令创建的“models.py”文件中
例如:

from django.db import models

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()

这段python代码创建了一个Publisher类,也就等同于在数据库中

CREATE TABLE "books_publisher" (
    "id" serial NOT NULL PRIMARY KEY,
    "name" varchar(30) NOT NULL,
    "address" varchar(50) NOT NULL,
    "city" varchar(60) NOT NULL,
    "state_province" varchar(30) NOT NULL,
    "country" varchar(50) NOT NULL,
    "website" varchar(200) NOT NULL
);

每个模型相当于单个数据库表,每个属性也是这个表中的一个字段。 属性名就是字段名,它的类型(例如 CharField )相当于数据库的字段类型 (例如 varchar )。

然后shell创建数据表,同步数据库信息
输入一下命令

# Django 1.6.x 及以下
python manage.py syncdb
 
# Django 1.7 及以上的版本需要用以下命令
python manage.py makemigrations
python manage.py migrate

python manage.py makemigrations [appname]
python manage.py migrate [appname]
初始化数据库,如此,我们就可以在django项目中使用mysql数据库了。

image.png

image.png

然后可以看到数据库里对应了相应的表
如何使用这个表呢?方法和上面一样
使用 Django 提供的 QuerySet API
Django提供了丰富的API, 下面演示如何使用它。

image.png

我们新建了一个用户WeizhongTu,它返回了一个类,名字为我们创建的, 那么如何从数据库是查询到它呢?


image.png

我们用了一个 .objects.get() 方法查询出来符合条件的对象,但是大家注意到了没有,我的models.py中多写了def....最后两行

from django.db import models
 
class Person(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()
     
    def __unicode__(self):
    # 在Python3中使用 def __str__(self):
        return self.name

如果我们不添加的话它将返回<Person: Person object>

>>> Person.objects.get(name="WeizhongTu")
<Person: Person object>
>>>

这里并没有显示出与WeizhongTu的相关信息,如果用户多了就无法知道查询出来的到底是谁,查询结果是否正确,所以我们修改一下 people/models.py,添加最后两行内容
注意:name 和 age 等字段中不能有 __(双下划线,因为在Django QuerySet API中有特殊含义(用于关系,包含,不区分大小写,以什么开头或结尾,日期的大于小于,正则等)

也不能有Python中的关键字,name 是合法的,student_name 也合法,但是student__name不合法,try, class, continue 也不合法,因为它是Python的关键字( import keyword; print(keyword.kwlist) 可以打出所有的关键字)

新建一个对象的方法有以下几种:

Person.objects.create(name=name,age=age)

p = Person(name="WZ", age=23)

p.save()

p = Person(name="TWZ")

p.age = 23

p.save()

Person.objects.get_or_create(name="WZT", age=23)

这种方法是防止重复很好的方法,但是速度要相对慢些,返回一个元组,第一个为Person对象,第二个为True或False, 新建时返回的是True, 已经存在时返回False.



获取对象有以下方法:

Person.objects.all()

Person.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存

Person.objects.get(name=name)



get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到filter

Person.objects.filter(name="abc")  # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人

Person.objects.filter(name__iexact="abc")  # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件



Person.objects.filter(name__contains="abc")  # 名称中包含 "abc"的人

Person.objects.filter(name__icontains="abc")  #名称中包含 "abc",且abc不区分大小写



Person.objects.filter(name__regex="^abc")  # 正则表达式查询

Person.objects.filter(name__iregex="^abc")  # 正则表达式不区分大小写



filter是找出满足条件的,当然也有排除符合某条件的

Person.objects.exclude(name__contains="WZ")  # 排除包含 WZ 的Person对象

Person.objects.filter(name__contains="abc").exclude(age=23)  # 找出名称含有abc, 但是排除年龄是23

然后注册我们的models在admin上,效果和上面是一样的


image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容