赞
踩
Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。
MVC 模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
MVC 以一种插件式的、松耦合的方式连接在一起。
Django 的 MTV 模式本质上和 MVC 是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django 的 MTV 分别是指:
django-admin startproject My_Project
创建完成后我们可以查看下项目的目录结构:
$ cd My_Project/ #项目的容器。
$ tree
.
|-- My_Project
| |-- __init__.py
| |-- asgi.py #一个 ASGI 兼容的 Web 服务器的入口,以便运行你的项目。
| |-- settings.py #该 Django 项目的设置/配置。
| |-- urls.py #一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。
| `-- wsgi.py #一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。
`-- manage.py #一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。
WSGI (Web Server Gateway Interface) 是一个 Python 规范,它定义了 Web 服务器和 Python Web 应用程序之间通信的方式。
ASGI (Asynchronous Server Gateway Interface) 是一个新的 Python 规范,它扩展了 WSGI 规范,支持异步操作。
WSGI 的主要作用是:
定义 Web 服务器和 Python Web 应用程序之间通信的标准
: WSGI 规范定义了服务器环境变量、应用程序对象和 WSGI 协议,这使得不同的 Web 服务器和 Python Web 应用程序可以相互兼容。简化 Web 应用程序的开发
: 通过使用 WSGI 规范,Web 应用程序开发人员可以专注于编写应用程序逻辑,而无需担心服务器端代码。提高 Web 应用程序的性能
: WSGI 规范支持多线程和多进程,这可以提高 Web 应用程序的性能。
ASGI 的主要作用是:
支持异步操作
: ASGI 规范支持异步操作,例如数据库查询和网络请求。这可以提高 Web 应用程序的性能,因为异步操作可以并发执行。提高 Web 应用程序的扩展性
: ASGI 规范支持多进程和多线程,这可以提高 Web 应用程序的扩展性。
python manage.py startapp my_app
在你的 Django 项目的 settings.py 文件中,将 my_app 添加到 INSTALLED_APPS 列表中:
INSTALLED_APPS = [
# ... 其他应用
'my_app',
]
在创建应用后,需要运行数据库迁移以创建数据库表:
python manage.py makemigrations
python manage.py migrate
my_app/
├── __init__.py
├── admin.py #用于注册模型的管理界面
├── apps.py #用于配置应用的元数据
├── migrations/ #用于存储数据库迁移文件
│ └── __init__.py
├── models.py #models.py 文件是定义模型的地方。每个模型都对应一个数据库表。
├── tests.py #编写测试用例
└── views.py #这个文件用于编写视图函数。视图函数处理用户请求并返回响应。
python3 manage.py runserver 0.0.0.0:8000
在浏览器输入你服务器的 ip(这里我们输入本机 IP 地址: 127.0.0.1:8000) 及端口号,如果正常启动,输出结果如下:
在view.py文件中写响应
#My_Project/myapp/views.py:
from django.http import HttpResponse
def hello(request):
return HttpResponse("Hello world ! ")
接着,绑定 URL 与视图函数。打开 urls.py 文件,删除原来代码,将以下代码复制粘贴到 urls.py 文件中:
#My_Project/myapp/urls.py:
from django.urls import path
from . import views
urlpatterns = [
path("", views.hello, name="hello"),
]
完成后,启动 Django 开发服务器,并在浏览器访问打开浏览器并访问:
path
和 re_path
都是 Django 中的 URL 路由函数,用于将 URL 模式与视图函数进行关联。
path
函数用于匹配精确的 URL 路径。re_path
函数用于匹配正则表达式。from django.urls import path, re_path
urlpatterns = [
path('articles/<int:year>/', views.article_list),
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.article_list),
]
path
函数用于匹配精确的 URL 路径,而 re_path
函数用于匹配正则表达式。path
函数的性能比 re_path
函数更高,因为 path
函数不需要编译正则表达式。re_path
函数比 path
函数更灵活,因为它可以匹配更复杂的 URL 模式。/articles/2023/
:path('articles/<int:year>/', views.article_list)
/articles/2023/
和 /articles/2024/
:re_path(r'^articles/(?P<year>[0-9]{4})/$', views.article_list)
在 my_app 目录底下创建 templates 目录并建立 runoob.html文件,整个目录结构如下
My_Project/ ├── manage.py ├── my_app/ │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations/ │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ ├── views.py │ └── templates/ │ └── runoo.bhtml ├── db.sqlite3 └── My_Project/ ├── __init__.py ├── asgi.py ├── settings.py ├── urls.py └── wsgi.py
runoob.html 文件代码如下:
<h1>{{ hello }}</h1>
接下来我们需要向Django说明模板文件的路径,修改HelloWorld/settings.py,修改 TEMPLATES 中的 DIRS 为 [os.path.join(BASE_DIR, ‘templates’)],如下所示:
... TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], # 修改位置 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] ...
我们现在修改 views.py,增加一个新的对象,用于向模板提交数据:
from django.shortcuts import render
def runoob(request):
context = {}
context['hello'] = 'Hello World!'
return render(request, 'runoob.html', context)
urls.py文件修改为:
from django.urls import path
from . import views
urlpatterns = [
path('runoob/', views.runoob),
]
再次访问 http://127.0.0.1:8000/runoob,可以看到页面:
Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。
Django 模型使用自带的 ORM。
对象关系映射
(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换。
ORM 在业务逻辑层
和数据库层
之间充当了桥梁的作用。
ORM 是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。
ORM 解析过程:
ORM对应关系表
创建 MySQL 数据库( ORM 无法操作到数据库级别,只能操作到数据表)语法,例如我们创建一个名为 runoob 数据库,编码指定为 utf8:
create database runoob default charset=utf8; # 防止编码问题,指定为 utf8
我们在项目的 settings.py 文件中找到 DATABASES 配置项,将其信息修改为:
DATABASES = {
'default':
{
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'runoob', # 数据库名称
'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
'PORT': 3306, # 端口
'USER': 'root', # 数据库用户名
'PASSWORD': '123456', # 数据库密码
}
}
上面包含数据库名称和用户的信息,它们与 MySQL 中对应数据库和用户的设置相同。Django 根据这一设置,与 MySQL 中相应的数据库和用户连接起来。
接下来,告诉 Django 使用 pymysql 模块连接 mysql 数据库:
# 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置
import pymysql
pymysql.install_as_MySQLdb()
修改my_app/models.py:
# models.py
from django.db import models
class Test(models.Model):
name = models.CharField(max_length=20)
以上的类名代表了数据库表名,且继承了models.Model
,类里面的字段代表数据表中的字段(name),数据类型则由CharField(相当于varchar)、DateField(相当于datetime), max_length 参数限定长度。
在命令行中运行:
$ python3 manage.py migrate # 创建表结构
$ python3 manage.py makemigrations my_app # 让 Django 知道我们在我们的模型有一些变更
$ python3 manage.py migrate my_app # 创建表结构
注意:尽管我们没有在 models 给表设置主键,但是 Django 会自动添加一个 id 作为主键。
接下来我们在 My_Project 目录中添加 testdb.py 文件(下面介绍),并修改 urls.py:
from django.urls import path
from . import views,testdb
urlpatterns = [
path('runoob/', views.runoob),
path('testdb/', testdb.testdb),
]
添加数据需要先创建对象,然后再执行 save 函数,相当于SQL中的INSERT:
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from my_app.models import Test
# 数据库操作
def testdb(request):
test1 = Test(name='runoob')
test1.save()
return HttpResponse("<p>数据添加成功!</p>")
访问 http://127.0.0.1:8000/testdb 就可以看到数据添加成功的提示。
# testdb.py # -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # 数据库操作 def testdb(request): # 初始化 response = "" response1 = "" # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM listTest = Test.objects.all() # filter相当于SQL中的WHERE,可设置条件过滤结果 response2 = Test.objects.filter(id=1) # 获取单个对象 response3 = Test.objects.get(id=1) # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2; Test.objects.order_by('name')[0:2] #数据排序 Test.objects.order_by("id") # 上面的方法可以连锁使用 Test.objects.filter(name="runoob").order_by("id") # 输出所有数据 for var in listTest: response1 += var.name + " " response = response1 return HttpResponse("<p>" + response + "</p>")
修改数据可以使用 save() 或 update():
# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # 数据库操作 def testdb(request): # 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE test1 = Test.objects.get(id=1) test1.name = 'Google' test1.save() # 另外一种方式 #Test.objects.filter(id=1).update(name='Google') # 修改所有的列 # Test.objects.all().update(name='Google') return HttpResponse("<p>修改成功</p>")
删除数据库中的对象只需调用该对象的delete()方法即可:
# -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # 数据库操作 def testdb(request): # 删除id=1的数据 test1 = Test.objects.get(id=1) test1.delete() # 另外一种方式 # Test.objects.filter(id=1).delete() # 删除所有数据 # Test.objects.all().delete() return HttpResponse("<p>删除成功</p>")
一个视图函数,简称视图,是一个简单的 Python 函数,它接受 Web 请求并且返回 Web 响应。
视图层中有两个重要的对象:请求对象(request)与响应对象(HttpResponse)。
取值格式:对象.方法。
get():返回字符串,如果该键对应有多个值,取出该键的最后一个值。
def runoob(request):
name = request.GET.get("name")
return HttpResponse('姓名:{}'.format(name))
def runoob(request):
name = request.POST.get("name")
return HttpResponse('姓名:{}'.format(name))
获取当前请求的方式,数据类型是字符串,且结果为大写。
def runoob(request): name = request.method print(name) return HttpResponse("菜鸟教程") 返回结果 POST ``` ## 响应对象:HttpResponse 对象 响应对象主要有三种形式:HttpResponse()、render()、redirect()。 HttpResponse(): 返回文本,参数为字符串,字符串中写文本内容。如果参数为字符串里含有 html 标签,也可以渲染。 ```python def runoob(request): # return HttpResponse("菜鸟教程") return HttpResponse("<a href='https://www.runoob.com/'>菜鸟教程</a>") ``` render(): 返回文本,第一个参数为 request,第二个参数为字符串(页面名称),第三个参数为字典(可选参数,向页面传递的参数:键为页面参数名,值为views参数名)。 ````python def runoob(request): name ="菜鸟教程" return render(request,"runoob.html",{"name":name}) ``` redirect():重定向,跳转新页面。参数为字符串,字符串中填写页面路径。一般用于 form 表单提交后,跳转到新页面。 ```python def runoob(request): return redirect("/index/") ```
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。