Python视频学习(十二、Django)

本教程详细介绍了Django框架的使用,从虚拟环境搭建到数据库操作,涵盖模型创建、ORM操作、视图、模板、URL配置、数据库迁移、错误处理、后台管理、权限认证、文件上传等多个方面。通过实例演示,帮助开发者掌握Django的每个核心概念,实现高效Web开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

0 背景

0.1 MVC框架

软件框架是由其中的各个模块组成的,每个模块负责特定的功能,模块与模块之间相互协作来完成软件开发。软件框架的设计,也是针对某一类软件问题而设计的,其目的主要是提高软件开发效率。

MVC框架的核心思想是:解耦,让不同的代码块之间降低耦合,增强代码的可扩展性和可移植性,实现向后兼容。

  • M 全拼为Model,主要封装对数据库层的访问,对数据库中的数据进行增、删、改、查操作。
  • V 全拼为View,用于封装结果,生成页面展示的html内容。
  • C 全拼为Controller,用于接收请求,处理业务逻辑,与Model和View交互,返回结果。

在这里插入图片描述

0.2 Django

Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以"插件"形式服务于整个框架,Django有许多功能强大的第三方插件,你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展性。它还强调快速开发和DRY(DoNotRepeatYourself)原则。

django官方网站
django源码

Django框架遵循MVC设计,并且有一个专有名词:MVT

  • M:全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。
  • V:全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答。
  • T:全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html。

在这里插入图片描述

1. 虚拟环境

虚拟环境是真实python环境的复制版本。
在虚拟环境中使用的python是复制的python,安装python包也是安装在复制的python中。

安装好virtualenv后在.bashrc中添加下面2行:

export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
命令 含义
sudo pip install virtualenv 安装虚拟环境
sudo pip install virtualenvwrapper 安装虚拟环境扩展包
export WORKON_HOME=$HOME/.virtualenvs 在配置文件中设置 WORKON_HOME
mkvirtualenv 虚拟环境名 创建虚拟环境
mkvirtualenv -p python3 环境名 创建指定python版本的虚拟环境
workon 虚拟环境名 进入虚拟环境
workon tab-tab 查看所有环境
deactivate 退出当前虚拟环境
rmvirtualenv 虚拟环境名 删除虚拟环境:
pip install 包名 在当前虚拟环境中安装包
注意不能加sudo,否则就是给系统环境安装
pip install django==1.8.2 指定版本安装包
pip freeze > requirements.txt 将当前python环境的包信息导出,为了让别的环境安装依赖时方便

注意:在虚拟环境中不可使用sudo pip install 包名称 来安装python包,这样安装的包实际是安装在了真实的主机环境上。

2. ★第一个Django案例

安装django环境
创建django项目
设计模型类并利用模型类和数据库进行交互
使用django后台管理数据
编写视图函数,进行URL配置
模板的使用
图书-英雄案例完成

2.1 创建项目

在Django中,一个程序包含多个app,每个app负责不同的功能模块:

在这里插入图片描述

步骤:

  1. 创建项目
  2. 创建app
  3. 注册app
  4. 运行服务器

a. 创建项目

django-admin startproject 项目名称

项目目录说明

在这里插入图片描述

目录/文件 作用
manage.py 是项目管理文件,通过它管理项目。
与项目同名的目录,此处为test1。 主模块
__init__.py 是一个空文件,作用是这个目录test1可以被当作包使用。
settings.py 是项目的整体配置文件。
urls.py 是项目的URL配置文件。
wsgi.py 是项目与WSGI兼容的Web服务器入口,详细内容会在布署中讲到。

b. 创建app

python manage.py startapp booktest
目录说明

在这里插入图片描述

目录/文件 作用
admin.py 文件跟网站的后台管理相关。
__init.py__ 是一个空文件,表示当前目录booktest可以当作一个python包使用。
migrations文件夹 数据库迁移相关
models.py 文件跟数据库操作相关。
tests.py 文件用于开发测试用例,在实际开发中会有专门的测试人员,这个事情不需要我们来做。
views.py 跟接收浏览器请求,进行处理,返回页面相关。相当于controller

c. 安装应用

应用创建成功后,需要安装才可以使用,也就是建立应用和项目之间的关联。

在主模块的 settings.pyINSTALLED_APPS下添加应用的名称就可以完成安装。

在这里插入图片描述

d. 运行测试服务器

在开发阶段,为了能够快速预览到开发的效果,django提供了一个纯python编写的轻量级web服务器,仅在开发阶段使用。

python manage.py runserver ip:端口
例:
python manage.py runserver

可以不写IP和端口,默认IP是127.0.0.1,默认端口为8000。

在这里插入图片描述

如果增加、修改、删除文件,服务器会自动重启;

在这里插入图片描述

2.2 ORM操作

O是object,也就类对象的意思,R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思,M是mapping,是映射的意思。在ORM框架中,它帮我们把类和数据表进行了一个映射,可以让我们通过类和类对象就能操作它所对应的表格中的数据。ORM框架还有一个功能,它可以根据我们设计的类自动帮我们生成数据库中的表格,省去了我们自己建表的过程。

django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作。

步骤:

  1. 在models.py中定义模型类
  2. 执行数据迁移
  3. 通过类和对象完成数据增删改查操作

a. 定义模型类——继承models.Model

在每个appmodel.py中定义模型类,继承自models.Model

说明:不需要定义主键列,在生成时会自动添加,并且值为自动增长。

from django.db import models

# Create your models here.
class BookInfo(models.Model):
    btitle = models.CharField(max_length= 20)
    bpub_date = models.DateField()

class HeroInfo(models.Model):
    hname = models.CharField(max_length=20)
    hgender = models.BooleanField()
    hcomment = models.CharField(max_length=100)
    hbook = models.ForeignKey('BookInfo',on_delete = models.CASCADE)
on_delete

Django2以上,ForeignKey字段一定要写on_delete参数,可选的如下(都在django.db.models内):

参数 说明
CASCADE 级联删除
PROTECT 阻止引用对象删除,会抛出异常ProtectedError
SET_NULL 设置为NULL, 只有当null参数为True时才可以
SET_DEFAULT 设置成默认值,所以一定要传递参数default
SET on_delete=models.SET(get_sentinel_user),

b. 数据迁移—— manage.py makemigrations, migrate

迁移由两步完成:

  1. 生成迁移文件:根据模型类生成创建表的迁移文件。
    python manage.py makemigrations

  2. 执行迁移:根据第一步生成的迁移文件在数据库中创建表。
    python manage.py migrate

Django框架根据我们设计的模型类生成了迁移文件,在迁移文件中我们可以看到fields列表中每一个元素跟BookInfo类属性名以及属性的类型是一致的。同时我们发现多了一个id项,这一项是Django框架帮我们自动生成的,在创建表的时候id就会作为对应表的主键列,并且主键列自动增长

在这里插入图片描述

在这里插入图片描述

默认数据库

Django默认采用sqlite3数据库,上图中的db.sqlite3就是Django框架帮我们自动生成的数据库文件。

sudo apt-get install sqliteman

数据库的设置在settings.py中:

在这里插入图片描述

生成字段名

生成的列名和自己定义的列名相同,并且多了一个id项,这一项是Django框架帮我们自动生成的,在创建表的时候id就会作为对应表的主键列,并且主键列自动增长。

关系属性生成的字段名为: 关系属性名_id

生成表名——app名_类名
应用名_model名
<app_name>_<model_name>

c. ★操作数据—— manage.py shell

python manage.py shell

完成数据表的迁移之后,下面就可以通过进入项目的shell,进行简单的API操作。如果需要退出项目,可以使用ctrl+d快捷键或输入quit()。

基本查询命令 说明
BookInfo.objects.all() 查询所有图书
图书对象.save() 保存当前图书信息到数据库/ 修改图书信息
b=BookInfo.objects.get(id=1) 根据主键查询图书
图书对象.delete() 删除图书信息
关联对象查询命令 说明
b.heroinfo_set.all() 返回该图书关联的所有英雄信息
h.hbook_id 获取外键值
h.hbook 获取外键引用对象

多的一方可以直接使用属性值来访问一 的一方, 而一的一方获取多的一方时,需要使用 xxx_set

from booktest.models import BookInfo,HeroInfo  # 引入类
from datetime import date

b1 = BookInfo()
b1.btitle= "金庸新著"
b1.bpub_date = date(1991,1,1)
b1.save()  # 保存

b2 = BookInfo()
b2.btitle= "屠龙宝刀"
b2.bpub_date = date(1995,5,6)
b2.save()  # 保存

BookInfo.objects.all() # 获取所有
BookInfo.objects.get(id=1) # 根据id获取
BookInfo.objects.get(pk=1) # 根据主键获取

b1.btitle="点击就送"
b1.save()  # 修改

b.delete()  # 删除
操作关系字段
b1 = BookInfo.objects.get(id=1)

h = HeroInfo()
h.hname = "张无忌"
h.hgender = True
h.hbook = b1

h.save()

h.hbook_id  # 获取外键值
h.hbook    # 获取引用对象

b1.heroinfo_set.all()  # 反向获取对象

在这里插入图片描述

2.3 后台管理操作——admin

步骤:

  1. 管理界面本地化
  2. 创建管理员
  3. 注册模型类
  4. 自定义管理页面

a 界面本地化

在主模块的settings.py中,设置:

LANGUAGE_CODE = 'zh-hans' #使用中国语言
TIME_ZONE = 'Asia/Shanghai' #使用中国上海时间

b 创建管理员—— manage.py createsuperuser

python manage.py createsuperuser

在这里插入图片描述

然后启动:

python manage.py runserver

进入URL:

http://127.0.0.1:8000/admin/

c. 注册模型类

要让自己创建的模型类,可以被admin页面管理,需要对他们进行注册:

进入主模块的admin.py:

from django.contrib import admin
from booktest.models import BookInfo,HeroInfo
# 后台管理相关文件
# Register your models here.

# 注册模型类
admin.site.register(BookInfo)
admin.site.register(HeroInfo)

再刷新

d. 自定义管理页面

Django提供了自定义管理页面的功能,比如列表页要显示哪些值。

进入主模块的admin.py,创建自己的ModelAdmin类,然后在里面的list_display类属性决定了显示哪些 属性:

from django.contrib import admin
from booktest.models import BookInfo,HeroInfo
# 后台管理相关文件
# Register your models here.
# 自定义模型管理类
class BookInfoAdmin(admin.ModelAdmin):
    '''图书模型管理类'''
    list_display = ['id', 'btitle', 'bpub_date']


class HeroInfoAdmin(admin.ModelAdmin):
    '''英雄人物模型管理类'''
    list_display = ['id', 'hname', 'hcomment']

# 注册模型类
# admin.site.register(BookInfo)
admin.site.register(BookInfo, BookInfoAdmin)
admin.site.register(HeroInfo, HeroInfoAdmin)

2.4 视图初级(MVC中的C)

步骤:

  1. 定义视图函数
  2. 配置URLconf

a. 定义视图函数

  • 视图函数就是普通的Python函数
  • 定义在每个app中的views.py
  • 函数接收一个参数request
  • 函数返回django.http.HttpResponse对象
  • django.shortcuts中有快捷方式render、 redirect
from django.shortcuts import render
from django.http import HttpResponse
import time
# Create your views here.
def index(request):
    currenttime = str(time.localtime().tm_min) +":"+ str(time.localtime().tm_sec)
    return HttpResponse(currenttime )

b. ★配置url

https://docs.djangoproject.com/en/2.1/topics/http/urls/

django查找URL的顺序是这样子的:

  1. Django查看root URLconf module. 默认的,会查看settings.py中的ROOT_URLCONF, 但是如果发送来的HttpRequest object中有 urlconf 属性(set by middleware), 那么这个值就会覆盖ROOT_URLCONF设置
  2. Django 读取root URLconf module这个模块中的变量名为urlpatterns的内容,它应该是一个list,并且都是django.urls.path()或者django.urls.re_path()的实例
  3. Django 遍历所有URL pattern, 找到第一个匹配的URL
  4. 一旦匹配成功,Django就会引入对应的view来调用,which is a simple Python function (or a class-based view). The view gets passed the following arguments:
    • An instance of HttpRequest.
    • If the matched URL pattern returned no named groups, then the matches from the regular expression are provided as positional arguments.
    • The keyword arguments are made up of any named parts matched by the path expression, overridden by any arguments specified in the optional kwargs argument to django.urls.path() or django.urls.re_path().
  5. 如果没有匹配成功,或者匹配过程有任何错误,那么Django invokes an appropriate error-handling view. See Error handling below.

主模块的urls.py中:

from django.contrib import admin
from django.urls import path
from django.urls import include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',  include('booktest.urls'))
]

booktest应用中的urls.py(需要自己创建):

from  django.conf.urls import url
from django.urls import re_path
from .views import index

urlpatterns = [
    re_path(r'.*', index),
    # url(r'index', index),
    # url('^',index)
]

页面url地址设置

习惯统一以/开头,这样就会从host开始拼接,如果不写/,则会当成相对地址

<a href="/create">新增</a>

2.5 模板初级(MVC中的V)

步骤:

  1. 创建模板文件夹和模板文件
  2. settings.py中配置模板路径
  3. view中加载模板文件对象
  4. 给模板传递数据,生成上下文
  5. 渲染上下文,得到html
  6. 返回html

a. 创建模板目录和文件

直接在项目名底下建立目录templates, 然后在该目录中,为每个app建立同名文件夹:

在这里插入图片描述

b. 配置模板路径

settings.py中,找到TEMPLATESDIR, 加上模板路径:

'DIRS': [os.path.join(BASE_DIR, 'templates')],

在这里插入图片描述

c. 模板文件内代码书写

{
  {变量名}}

{%代码段%}
比如:
{% for i in data %}
	循环内部代码
{% empty %}
	如果循环列表长度为0则运行这部分
{% endfor %}

d. 视图中调用模板

  1. 找到模板
  2. 定义上下文
  3. 渲染模板
from django.http import HttpResponse
from django.template import loader,RequestContext

def index(request):
    '''使用模板文件'''
    # 使用模板文件
    # 1.加载模板文件, 模板对象
    temp = loader.get_template('booktest/index.html')
    # 2.定义模板上下文:给模板文件传递数据
    context = RequestContext(request, {
   } )
    # 3.模板渲染:产生标准的html内容
    res_html = temp.render(context)
    # 4.返回给浏览器
    return HttpResponse(res_html)

★使用快捷方式
def index(request):
    # 进行处理,和M和T进行交互。。。
    # return HttpResponse('老铁,没毛病')
    # return my_render(request, 'booktest/index.html')
	return render(request, 'booktest/index.html', {
   'content':'hello world', 'list':list(range(1,10))})

3. ★模型高级——ORM

对象-关系映射ORM系统一般以中间件的形式存在

在这里插入图片描述

3.1 配置MYSQL数据库

a. 配置数据库信息

settings.py中:

DATABASES = {
   
    'default': {
   
        # 'ENGINE': 'django.db.backends.sqlite3',
        'ENGINE': 'django.db.backends.mysql',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'NAME': 'test2', #数据库名字,
        'USER': 'root', #数据库登录用户名
        'PASSWORD': 'mysql', #数据库登录密码
        'HOST': 'localhost', #数据库所在主机
        'PORT': '3306', #数据库端口
    }
}

注意:数据库test2 Django框架不会自动生成,需要我们自己进入mysql数据库去创建。

b. 安装mysql数据库的包

pip install pymysql

c. 添加install mysql

在主模块的__init__.py内写入:

import pymysql
pymysql.install_as_MySQLdb()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值