初学Django,有哪些入门技巧分享?
- 内容介绍
- 文章标签
- 相关推荐
本文共计3011个文字,预计阅读时间需要13分钟。
目录+安装启动+HTTP请求URL路径+项目APP+返回+页面内容+给浏览器+路由+路由子表+创建数据库+定义数据库表+创建数据库表+Django Admin+读取数据库数据+过滤条件+对资源的增查改删处理+CRUD
目录- 安装&启动
- HTTP请求URL路由
- 项目APP
- 返回 页面内容 给浏览器
- 路由
- 路由子表
- 创建数据库
- 定义数据库表
- 创建数据库表
- Django Admin
- 读取数据库数据
- 过滤条件
- 对资源的增查改删处理
- CRUD
- 临时取消 CSRF 校验
- 前端整合
- 实现登录
- session 方案
- 数据库表的关联
- 参考
IDEA 这里安装即可。安装后 new 一个新项目, 在控制台使用
python manage.py runserver 0.0.0.0:80
出现 Django 的图标就说明好了。
- manage.py:命令行工具,内置多种方式与项目进行交互。
- _ _init _ _.py:初始化文件,一般情况下无需修改。
- settings.py:项目配置文件,项目的所有功能都需要在该文件中进行配置。
- urls.py:项目的路由设置,设置网站的具体内容。
- wsgi.py:全称为 Python Web Server Gateway Interface ,即 Python 服务器网关接口,是 Python 应用与Web服务器之间的接口,用于Django项目在服务器上的部署和上线,一般不需要修改。
在Web部署的方案上,有一个方案是目前应用最广泛的:
- 部署一个Web服务器专门用来处理HTTP协议层面相关的事情,比如如何在一个物理机上提供多个不同的Web服务(单IP多域名,单IP多端口等)这种事情。
- 部署一个用各种语言编写(Java, PHP, Python, Ruby等)的应用程序,这个应用程序会从Web服务器上接收客户端的请求,处理完成后,再返回响应给Web服务器,最后由Web服务器返回给客户端。
要采用第2种方案,Web服务器和应用程序之间就要知道如何进行交互。
为了定义Web服务器和应用程序之间的交互过程,就形成了很多不同的规范。
比如改进CGI性能的FasgCGI,Java专用的Servlet规范,还有Python专用的WSGI规范等。
提出这些规范的目的就是为了定义统一的标准,提升程序的可移植性。
WSGI存在的目的有两个:
- 让Web服务器知道如何调用Python应用程序,并且把用户的请求告诉应用程序。
- 让Python应用程序知道用户的具体请求是什么,以及如何返回结果给Web服务器。
在WSGI中定义了两个角色,Web服务器端称为server或者gateway,应用程序端称为application或者framework(因为WSGI的应用程序端的规范一般都是由具体的框架来实现的)。
server端会先收到用户的请求,然后会根据规范的要求调用application端,调用的结果会被封装成HTTP响应后再发送给客户端。高效的 wsgi web sever 产品,例如:gunicorn,uwsgi等。
如果崇尚自由可定制,可以尝试wsgi web开发的信马由韁,如果坚守稳定可靠, servlet的规范一致给你足够的信心。好坏只在你的需求,无关对错。
HTTP请求URL路由 项目APP
Django 中的一个app 就是项目里面的一个应用的意思。
一个项目包含多个app。一个app 通常就是一个相对独立的模块 ,实现相对独立的功能。
一个app 本质上 就是一个 Python 包, 里面包含了一些应用相关的代码文件。
当然所有功能放一起也可以,就是比较臃肿。
控制台 new 一个 新项目:
django-admin startproject 项目名
控制台 new 一个 新app:
python manage.py startapp app名字
app名字/
__init__.py
admin.py
apps.py
migrations/
models.py
views.py
这个目录其实就是一个python package
返回 页面内容 给浏览器
比如,我们 设计 凡是浏览器访问的docs.djangoproject.com/en/2.0/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
记得导入 import os
首先我们需要创建数据库,执行如下命令
python manage.py migrate
就会在 项目的根目录下面 生成一个配置文件中指定的数据库文件 db.sqlite3。
Django 里面, 数据库表的操作,包括 表的定义、表中数据的增删改查,都可以通过 Model 类型的对象进行的。
通常,在Django中
- 定义一张数据库的表 就是定义一个继承自 django.db.models.Model 的类
- 定义该表中的字段(列), 就是定义该类里面的一些属性
- 类的方法就是对该表中数据的处理方法,包括 数据的增删改查
这样,开发者对数据库的访问,从原来的使用底层的 sql 语句,变成 面向对象的开发,通过一系列对象的类定义 和方法调用就可以 操作数据库。
这样做:
- 首先 极大的简化了我们应用中的数据库开发,因为无需使用sql语句操作数据库了, 提高了开发的效率;
- 其次 屏蔽了 不同的数据库访问的底层细节,基本做到了 开发好代码后,如果要换数据库,几乎不需要改代码, 修改几个配置项就可以了。
这种 通过 对象 操作数据库 的方法 被称之为 ORM (object relational mapping)。
定义数据库表
python manage.py startapp common
就会创建一个目录名为 common, 对应 一个名为 common 的app。
我们要定义数据库的表,无需执行sql语句,只需要在app目录下面 定义特殊的类就可以了。
数据库表的定义,一般是放在app目录中的 models.py里面的。
打开 common/models.py,发现里面是空的,因为我们还没有定义我们的业务所需要的表。
我们修改它,加入如下内容
from django.db import models
class Customer(models.Model):
# 客户名称
name = models.CharField(max_length=200)
# 联系电话
phonenumber = models.CharField(max_length=200)
# 地址
address = models.CharField(max_length=200)
这个 Customer 类继承自 django.db.models.Model, 就是用来定义数据库表的。
Djanog 有很多字段对象类型, 对应不同的类型的数据库字段。
大家可以参考官方文档
创建数据库表
在项目的配置文件 settings.py 中, INSTALLED_APPS 配置项 加入如下内容
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 加入下面这行
'common.apps.CommonConfig',
]
CommonConfig 是 AppConfig的 子类, 就表示这个是应用的配置类。
这里 name = ‘common’ , name 是用来定义 应用的python模块路径的。 这里就是说 应用 模块路径为 common 。
关于 其他的配置参数, 大家可以参考官方文档
现在Django知道了我们的 common 应用, 我们可以在项目根目录下执行命令
python manage.py makemigrations common
得到如下结果
Migrations for 'common':
common\migrations\0001_initial.py
- Create model Customer
这个命令,告诉Django , 去看看common这个app里面的models.py ,我们已经修改了数据定义, 你现在去产生相应的更新脚本。
执行一下,会发现在 common\migrations 目录下面出现了0001_initial.py, 这个脚本就是相应要进行的数据库操作代码。
随即,执行如下命令
python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, common, contenttypes, sessions
Running migrations:
Applying common.0001_initial... OK
就真正去数据库创建表了。
如果以后我们修改了Models.py 里面的库表的定义,都需要再次运行 python manage.py makemigrations common 和 python manage.py migrate 命令,使数据库同步该修改结果。
Django AdminDjango提供了一个管理员操作界面可以方便的 添加、修改、删除你定义的 model 表数据。
首先,我们需要创建 一个超级管理员账号。
进入到项目的根目录,执行如下命令,依次输入你要创建的管理员的 登录名、email、密码。
python manage.py createsuperuser
Username (leave blank to use 'root'): root
Email address: 1290267280@qq.com
Password:88888888
Password (again):88888888
Superuser created successfully.
然后我们需要修改应用里面的 管理员 配置文件 common/admin.py,注册我们定义的model类。这样Django才会知道。
from django.contrib import admin
from .models import Customer
admin.site.register(Customer)
好了,现在就可以访问 127.0.0.1/admin/ ,输入刚才注册的用户密码登录。
如果你是中文的操作系统,想使用中文的admin界面,应该在配置文件 settings.py 中 MIDDLEWARE 最后加入如下配置:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
# admin界面语言本地化
'django.middleware.locale.LocaleMiddleware',
]
读取数据库数据
现在我们来实现一个功能:浏览器访问 sales/customers/ ,我们的服务端就返回系统中所有的客户记录给浏览器。
在文件sales/views.py 中,定义一个listcustomers 函数,内容如下:
# 导入 Customer 对象定义
from common.models import Customer
def listcustomers(request):
# 返回一个 QuerySet 对象 ,包含所有的表记录
# 每条表记录都是是一个dict对象,
# key 是字段名,value 是 字段值
qs = Customer.objects.values()
# 定义返回字符串
retStr = ''
for customer in qs:
for name,value in customer.items():
retStr += f'{name} : {value} | '
# <br> 表示换行
retStr += '<br>'
return HttpResponse(retStr)
我们只需修改 sales/urls.py 即可,添加如下记录
path('customers/', views.listcustomers),
过滤条件
我们可以通过 filter 方法加入过滤条件,修改view里面的代码,如下所示 :
def listcustomers(request):
# 返回一个 QuerySet 对象 ,包含所有的表记录
qs = Customer.objects.values()
# 检查url中是否有参数phonenumber
ph = request.GET.get('phonenumber',None)
# 如果有,添加过滤条件
if ph:
qs = qs.filter(phonenumber=ph)
# 定义返回字符串
retStr = ''
for customer in qs:
for name,value in customer.items():
retStr += f'{name} : {value} | '
# <br> 表示换行
retStr += '<br>'
return HttpResponse(retStr)
Django 框架在 url 路由匹配到函数后, 调用函数时,会传入 一个 HttpRequest 对象给参数变量 request,该对象里面 包含了请求的数据信息。
HTTP 的 Get 请求url里面的参数(术语叫 querystring 里面的参数), 可以通过 HttpRequest对象的 GET 属性获取。这是一个类似dict的对象。
有了这个过滤条件,Django 会在底层执行数据库查询的SQL语句 加上相应的 where 从句,进行过滤查询。
注意,参数名 phonenumber 是和 定义的表 model 的属性名 phonenumber 一致的。
filter的过滤条件可以有多个,只要继续在后面的参数添加过滤条件即可。
对资源的增查改删处理
再为 管理员用户 专门创建一个应用 mgr 来处理相关的 请求。
python manage.py startapp mgr
前面,我们都是在views.py 里面定义函数,处理 docs.djangoproject.com/
本文共计3011个文字,预计阅读时间需要13分钟。
目录+安装启动+HTTP请求URL路径+项目APP+返回+页面内容+给浏览器+路由+路由子表+创建数据库+定义数据库表+创建数据库表+Django Admin+读取数据库数据+过滤条件+对资源的增查改删处理+CRUD
目录- 安装&启动
- HTTP请求URL路由
- 项目APP
- 返回 页面内容 给浏览器
- 路由
- 路由子表
- 创建数据库
- 定义数据库表
- 创建数据库表
- Django Admin
- 读取数据库数据
- 过滤条件
- 对资源的增查改删处理
- CRUD
- 临时取消 CSRF 校验
- 前端整合
- 实现登录
- session 方案
- 数据库表的关联
- 参考
IDEA 这里安装即可。安装后 new 一个新项目, 在控制台使用
python manage.py runserver 0.0.0.0:80
出现 Django 的图标就说明好了。
- manage.py:命令行工具,内置多种方式与项目进行交互。
- _ _init _ _.py:初始化文件,一般情况下无需修改。
- settings.py:项目配置文件,项目的所有功能都需要在该文件中进行配置。
- urls.py:项目的路由设置,设置网站的具体内容。
- wsgi.py:全称为 Python Web Server Gateway Interface ,即 Python 服务器网关接口,是 Python 应用与Web服务器之间的接口,用于Django项目在服务器上的部署和上线,一般不需要修改。
在Web部署的方案上,有一个方案是目前应用最广泛的:
- 部署一个Web服务器专门用来处理HTTP协议层面相关的事情,比如如何在一个物理机上提供多个不同的Web服务(单IP多域名,单IP多端口等)这种事情。
- 部署一个用各种语言编写(Java, PHP, Python, Ruby等)的应用程序,这个应用程序会从Web服务器上接收客户端的请求,处理完成后,再返回响应给Web服务器,最后由Web服务器返回给客户端。
要采用第2种方案,Web服务器和应用程序之间就要知道如何进行交互。
为了定义Web服务器和应用程序之间的交互过程,就形成了很多不同的规范。
比如改进CGI性能的FasgCGI,Java专用的Servlet规范,还有Python专用的WSGI规范等。
提出这些规范的目的就是为了定义统一的标准,提升程序的可移植性。
WSGI存在的目的有两个:
- 让Web服务器知道如何调用Python应用程序,并且把用户的请求告诉应用程序。
- 让Python应用程序知道用户的具体请求是什么,以及如何返回结果给Web服务器。
在WSGI中定义了两个角色,Web服务器端称为server或者gateway,应用程序端称为application或者framework(因为WSGI的应用程序端的规范一般都是由具体的框架来实现的)。
server端会先收到用户的请求,然后会根据规范的要求调用application端,调用的结果会被封装成HTTP响应后再发送给客户端。高效的 wsgi web sever 产品,例如:gunicorn,uwsgi等。
如果崇尚自由可定制,可以尝试wsgi web开发的信马由韁,如果坚守稳定可靠, servlet的规范一致给你足够的信心。好坏只在你的需求,无关对错。
HTTP请求URL路由 项目APP
Django 中的一个app 就是项目里面的一个应用的意思。
一个项目包含多个app。一个app 通常就是一个相对独立的模块 ,实现相对独立的功能。
一个app 本质上 就是一个 Python 包, 里面包含了一些应用相关的代码文件。
当然所有功能放一起也可以,就是比较臃肿。
控制台 new 一个 新项目:
django-admin startproject 项目名
控制台 new 一个 新app:
python manage.py startapp app名字
app名字/
__init__.py
admin.py
apps.py
migrations/
models.py
views.py
这个目录其实就是一个python package
返回 页面内容 给浏览器
比如,我们 设计 凡是浏览器访问的docs.djangoproject.com/en/2.0/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
记得导入 import os
首先我们需要创建数据库,执行如下命令
python manage.py migrate
就会在 项目的根目录下面 生成一个配置文件中指定的数据库文件 db.sqlite3。
Django 里面, 数据库表的操作,包括 表的定义、表中数据的增删改查,都可以通过 Model 类型的对象进行的。
通常,在Django中
- 定义一张数据库的表 就是定义一个继承自 django.db.models.Model 的类
- 定义该表中的字段(列), 就是定义该类里面的一些属性
- 类的方法就是对该表中数据的处理方法,包括 数据的增删改查
这样,开发者对数据库的访问,从原来的使用底层的 sql 语句,变成 面向对象的开发,通过一系列对象的类定义 和方法调用就可以 操作数据库。
这样做:
- 首先 极大的简化了我们应用中的数据库开发,因为无需使用sql语句操作数据库了, 提高了开发的效率;
- 其次 屏蔽了 不同的数据库访问的底层细节,基本做到了 开发好代码后,如果要换数据库,几乎不需要改代码, 修改几个配置项就可以了。
这种 通过 对象 操作数据库 的方法 被称之为 ORM (object relational mapping)。
定义数据库表
python manage.py startapp common
就会创建一个目录名为 common, 对应 一个名为 common 的app。
我们要定义数据库的表,无需执行sql语句,只需要在app目录下面 定义特殊的类就可以了。
数据库表的定义,一般是放在app目录中的 models.py里面的。
打开 common/models.py,发现里面是空的,因为我们还没有定义我们的业务所需要的表。
我们修改它,加入如下内容
from django.db import models
class Customer(models.Model):
# 客户名称
name = models.CharField(max_length=200)
# 联系电话
phonenumber = models.CharField(max_length=200)
# 地址
address = models.CharField(max_length=200)
这个 Customer 类继承自 django.db.models.Model, 就是用来定义数据库表的。
Djanog 有很多字段对象类型, 对应不同的类型的数据库字段。
大家可以参考官方文档
创建数据库表
在项目的配置文件 settings.py 中, INSTALLED_APPS 配置项 加入如下内容
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 加入下面这行
'common.apps.CommonConfig',
]
CommonConfig 是 AppConfig的 子类, 就表示这个是应用的配置类。
这里 name = ‘common’ , name 是用来定义 应用的python模块路径的。 这里就是说 应用 模块路径为 common 。
关于 其他的配置参数, 大家可以参考官方文档
现在Django知道了我们的 common 应用, 我们可以在项目根目录下执行命令
python manage.py makemigrations common
得到如下结果
Migrations for 'common':
common\migrations\0001_initial.py
- Create model Customer
这个命令,告诉Django , 去看看common这个app里面的models.py ,我们已经修改了数据定义, 你现在去产生相应的更新脚本。
执行一下,会发现在 common\migrations 目录下面出现了0001_initial.py, 这个脚本就是相应要进行的数据库操作代码。
随即,执行如下命令
python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, common, contenttypes, sessions
Running migrations:
Applying common.0001_initial... OK
就真正去数据库创建表了。
如果以后我们修改了Models.py 里面的库表的定义,都需要再次运行 python manage.py makemigrations common 和 python manage.py migrate 命令,使数据库同步该修改结果。
Django AdminDjango提供了一个管理员操作界面可以方便的 添加、修改、删除你定义的 model 表数据。
首先,我们需要创建 一个超级管理员账号。
进入到项目的根目录,执行如下命令,依次输入你要创建的管理员的 登录名、email、密码。
python manage.py createsuperuser
Username (leave blank to use 'root'): root
Email address: 1290267280@qq.com
Password:88888888
Password (again):88888888
Superuser created successfully.
然后我们需要修改应用里面的 管理员 配置文件 common/admin.py,注册我们定义的model类。这样Django才会知道。
from django.contrib import admin
from .models import Customer
admin.site.register(Customer)
好了,现在就可以访问 127.0.0.1/admin/ ,输入刚才注册的用户密码登录。
如果你是中文的操作系统,想使用中文的admin界面,应该在配置文件 settings.py 中 MIDDLEWARE 最后加入如下配置:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
# admin界面语言本地化
'django.middleware.locale.LocaleMiddleware',
]
读取数据库数据
现在我们来实现一个功能:浏览器访问 sales/customers/ ,我们的服务端就返回系统中所有的客户记录给浏览器。
在文件sales/views.py 中,定义一个listcustomers 函数,内容如下:
# 导入 Customer 对象定义
from common.models import Customer
def listcustomers(request):
# 返回一个 QuerySet 对象 ,包含所有的表记录
# 每条表记录都是是一个dict对象,
# key 是字段名,value 是 字段值
qs = Customer.objects.values()
# 定义返回字符串
retStr = ''
for customer in qs:
for name,value in customer.items():
retStr += f'{name} : {value} | '
# <br> 表示换行
retStr += '<br>'
return HttpResponse(retStr)
我们只需修改 sales/urls.py 即可,添加如下记录
path('customers/', views.listcustomers),
过滤条件
我们可以通过 filter 方法加入过滤条件,修改view里面的代码,如下所示 :
def listcustomers(request):
# 返回一个 QuerySet 对象 ,包含所有的表记录
qs = Customer.objects.values()
# 检查url中是否有参数phonenumber
ph = request.GET.get('phonenumber',None)
# 如果有,添加过滤条件
if ph:
qs = qs.filter(phonenumber=ph)
# 定义返回字符串
retStr = ''
for customer in qs:
for name,value in customer.items():
retStr += f'{name} : {value} | '
# <br> 表示换行
retStr += '<br>'
return HttpResponse(retStr)
Django 框架在 url 路由匹配到函数后, 调用函数时,会传入 一个 HttpRequest 对象给参数变量 request,该对象里面 包含了请求的数据信息。
HTTP 的 Get 请求url里面的参数(术语叫 querystring 里面的参数), 可以通过 HttpRequest对象的 GET 属性获取。这是一个类似dict的对象。
有了这个过滤条件,Django 会在底层执行数据库查询的SQL语句 加上相应的 where 从句,进行过滤查询。
注意,参数名 phonenumber 是和 定义的表 model 的属性名 phonenumber 一致的。
filter的过滤条件可以有多个,只要继续在后面的参数添加过滤条件即可。
对资源的增查改删处理
再为 管理员用户 专门创建一个应用 mgr 来处理相关的 请求。
python manage.py startapp mgr
前面,我们都是在views.py 里面定义函数,处理 docs.djangoproject.com/

