Django学习笔记(2)——Django 基础

2. Django 基础

2.1Django 基础知识

2.1.1 Django 概述

Django的特点

  • 功能完备:Django提供了“开箱即用”的功能,这些功能可以无缝结合在一起,并遵循一致性设计原则,对开发人员来说非常重要。Django有完善的ORM、强大的路由映射功能、完善的视图模板的实现、强大的缓存支持等。
  • 通用:Django可以构建多种类型的网站,可以与许多客户端框架一起工作,支持并且可以提供多种格式的内容,如HTML、RSS(Really SimpleSyndication,简单信息整合)、JSON (JavaScripe Object Notation,Java Script对象简谱)、XML(Extensible Markup Language,可扩展标记语言)等格式的内容。
  • 安全:Django能够自动保护网站,避免许多常见的安全错误。例如要将session放在cookie中这种易受攻击的方式改变为一种安全的方式,就让cookies只包含一个密钥,实际数据存储在数据库中;并用hash()函数加密用户密码。默认情况下,Django可以防范许多漏洞,包括SQL(StructurQuery Language,结构查询语言)注入、跨站脚本、CSRF(Cross-Site Request Forgery,跨站请求伪造)、单击劫持等。
  • 可移植:Django是用Python编写的,Python能在许多操作系统上运行,因此用Django开发的程序不受特定服务器操作系统的限制,可以在Linux、Windows、mac OS等操作系统上正常运行。
  • 自助管理后台:Django拥有一个强大的Django Admin管理后台,用户几乎不用写代码就拥有一个完整的后台管理页面。

Django还提供了其他的功能或模块

  • 表单:Django通过表单进行数据验证和处理
  • 用户身份验证和权限:Django有一个强大的、安全性很高的用户身份验证和权限系统。
  • 序列化数据:Django可以轻松地将数据序列化,并支持XML或JSON格式。
  • 管理后台:Django Admin管理后台使系统管理员能够轻松创建、编辑和查看网站中的任何数据模型,这个管理后台是Django默认包含的。
  • 缓存机制:Django提供灵活的缓存机制,可以存储部分页面,提高网页响应速度。

2.1.2 Django MTV 设计模式简介MVC

(Model-View-Controller)设计模式的概念存在时间长,也比较流行,所谓的MVC就是把Web应用分为模型(Model)、视图(View)和控制器(Controller)3层,它们之间以松耦合的方式连接在一起。MVC的通用解释是采用透明的数据存取方式,然后单独划分一层来显示数据,并且加上一个控制它的层,如下。
(1)模型代表数据存取层,它提供数据获取的接口,使模型从数据库中获取数据时,无须了解不同数据库取得数据的方式。模型通常会为数据库提供一层抽象与封装,这样无须更改代码就能使用不同的数据库。
(2)视图代表界面,是模型的表现层,决定在应用中显示什么和怎么显示。
(3)控制器负责业务逻辑,通过程序逻辑判断模型决定从数据库中获取什么信息,以及把什么信息传给视图。

它的设计模式常被称作MTV设计模型,M指的是数据模型(Model),T指的是模板文件(Template),V指的是视图函数(View)以及与它有密切关系的URL配置。
(1)模型:用来定义数据结构的类,并提供数据库表管理机制,主要用来定义字段的名称、类型、字段最大值、默认值、约束条件等

以下代码展示了一个非常简单的Django数据模型,从代码中可以看到,数据模型类必须继承于models.Model,它在类中定义了两个属性name和email,这两个属性相当于数据库表的字段,它们为字符类型,代码还设置了字段的一些约束,如最大长度、字段显示名称等。

from django.db import models
# 在此处编写数据模型代码
# 员工数据模型(员工数据表)
class employee(models.Model):
# 员工姓名
name=models.Char Field(max_length=32,verbose_name='姓名')
# 员工邮箱
email=models.Email Field(verbose_name='邮箱')

(2)模板文件:一般是HTML格式,用于定义文件的结构或布局,并使用占位符表示相关内容,通过视图函数提取数据模型的数据填充HTML文件的占位符,可以创建动态页面

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
	<body>{{ hello }}</body>
</html>

模板文件输出指定文档的结构,占位符用于表示在生成页面时填充的数据。在以上代码中,{{ hello}}称为模板变量,是一个占位符,视图函数可以用render()把变量hello传过来,在页面上显示时会用变量的实际值替换{{ hello }}
(3)MTV的V包含视图函数以及与它有密切关系的URL配置。视图函数:是一个处理Web请求的函数,它接收HTTP请求,经过一番处理,返回HTTP响应。也就是视图函数接收请求后,到数据模型里拿到客户端需要的数据,把数据以一定的格式传递给模板文件,然后Django把模板文件以HTTP 响应格式发送给浏览器。
下面列举一段视图函数的代码:

# 导入HTTP相关模块
from django.http import Http Response
def hello(request):
# 前面可以有向数据模型请求数据的代码
# 返回响应
return Http Response('Hello World!')

URL配置:建立URL与视图函数对应关系,相当于URL映射器,主要作用是根据浏览器(客户端)的URL,将HTTP请求重定向到相应的视图函数进行处理。
下面列举一段URL配置的代码:

from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('admin/',admin.site.urls),
path('hello/',views.hello),]

URL 配置一般存储在名为urls.py的文件中。在以上代码示例中,urlpatterns定义了特定URL表达式和相应视图函数之间的映射列表,如果接收到具有与指定模式匹配的URL的HTTP请求,则将调用相关联的视图函数(例如views.hello)并传递请求。

Django 的主要文件
Django按照MTV设计模式以松耦合的方式把不同功能分配到各个文件,这些文件“各司其职”,通过代码或配置的方式完成独立功能,并与其他文件进行协作

  • urls.py是进行URL配置的文件,是网址入口,建立URL表达式与视图函数的对应关系,也就是建立“访问网址就是调用函数”的机制。
  • views.py是视图函数存放模块,处理用户发出的请求。用户请求从urls.py中的配置项映射过来,逻辑代码分析用户请求后,从数据库中提取数据,向templates文件夹中的模板文件传递数据。
  • models.py是数据模型,定义数据表结构,是数据库操作的基础。
  • forms.py是Django表单定义文件,通过表单及字段属性设置,生成页面文本框,对用户提交的数据进行验证。
  • templates文件夹中的文件是模板文件,这些文件是视图函数渲染改造的对象,一般是HTML文件,它与视图函数共同生成具有动态内容的网页。
  • admin.py是管理后台配置文件,经过简单的配置代码,就能让后台对数据库数据进行管理
  • settings.py是Django配置文件,在文件中可设置应用程序模块、数据库类型、中间件等,可以让各应用程序共享配置内容。
  • apps.py是应用程序本身的配置文件。
  • tests.py是用来编写单元测试代码的文件。

2.2 Django的基本开发流程

2.2.1 部署开发环境

Django 官网下载地址
首先,我创建了python=3.6.3 的虚拟环境

  1. 在命令行中输入pip install Django==版本号 (例如版本号为2.1.4)
    在这里插入图片描述

  2. 检测是否安装成功。在命令行中输入pythonimport djangodjango.get_version()
    在这里插入图片描述

  3. 设置环境变量
    Scripts 文件夹中有一个django-admin.exe文件,就说明Django已安装成功。把scripts文件夹的路径加入操作系统的环境变量Path中,这样就可以直接在命令行终端输入Django命令。

  1. 查看虚拟环境的安装路径在这里插入图片描述
  2. 在上图所示的安装路径下找到Script文件夹
    在这里插入图片描述

2.2.2 创建项目

使用 django-admin 来创建项目:Anaconda Prompt窗口下输入django-admin startproject 项目名称
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  __init.py__ 
 # 一个空文件,用来告诉Python这是myproject目录的一个模块
 setting.py  
 # 项目配置文件,包含一些初始化设置# 存放URL表达式的文件,这里定义的每一个URL都对应一个视图函数,这个文件称为路由文件
 urls.py
 # 服务器程序和应用程序的一个协议接口,规定了使用的接口和功能,这个文件不需修改, Django已为项目配置好
 wsgi.py
 # 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目

2.2.3 创建应用程序

  1. 创建应用(一个项目下可以创建多个应用): 键入命令python manage.py startapp myapp
    在这里插入图片描述
    在这里插入图片描述
__init__.py
admin.py  # 配置管理后台,写少量代码就可以启用Django Admin管理后台
apps.py:  # 存放当前应用程序的配置
models.py  # 存放数据库相关的内容
tests.py  # 可在这个文件写测试代码以对当前应用程序进行测试
views.py  # 存放业务请求功能的代码
migrations/ # 这个文件夹中的文件保存该应用程序的数据库表与变化的相关内容

2.2.4 编写业务逻辑代码

业务逻辑代码按照Django的约定一般要写在views.py文件中,换句话说就是要在views.py文件中生成一个视图函数并在其中编写代码。打开/myproject/myapp/views.py,输入以下命令。

from django.shortcuts import render
from django.shortcuts import HttpResponse

# Create your views here.
def index(request):
    return HttpResponse('<h1>hello world</h1>')
def test(request):
    return HttpResponse('<h1>test ! </h1>')

第一行命令导入Http Response函数,这个函数把传入参数的内容显示在网页上。在views.py文件中可以通过函数编写代码实现业务逻辑,这些函数被称为视图函数。以上代码中的index()函数就是一个视图函数,它实现了在网页上显示hello world的功能。

2.2.5 建立URL和视图函数的对应关系

按照Django的约定,URL与视图函数的对应关系要放在urls.py文件中,对应关系以URL配置项形式放在文件中的一个列表变量中。打开路由文件urls.py,在urlpattens列表中增加“path(‘index/’, views.index),”建立URL与视图函数的对应关系。path()的第一个参数是URL表达式,用来匹配网址;第二个参数views index指的是views.py文件中的函数。

提示:URL 表达式路径只匹配网址中域名后面的部分。如 index/可以匹配http://127.0.0.1:8000/index/这个网址,其中“http://127.0.0.1:8000/”这部分自动被忽略

from django.contrib import admin
from django.urls import path
from myapp import views
urlpatterns = [
    path('admin/', admin.site.urls),
    # 指定URL与视图函数的对应关系
    path('index/',views.index),
    path('test/',views.test)
]

在命令行终端输入以下命令python manage.py runserver 运行程序,在浏览器上输入http://127.0.0.1:8000/index/进行测试

在这里插入图片描述

2.2.6 动态加载HTML文件

在项目根目录/myproject/下新建文件夹,名称为templates(这个名字约定不要修改)。然后在templates文件夹下新建一个HTML文件作为测试模板文件,名字为test.html,其代码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试模板</title>
</head>
<body>
    <div align="center">
        <h1>{{ hi }}</h1>
        <hr>
        <h2>{{ test }}</h2>
    </div>
</body>
</html>

这个HTML文件的代码非常简单,主要是用于测试,代码中双花括号包括一个变量,称为模板变量,形如{{ 变量名 }},注意变量名与双花括号之间前后都有空格。Django 模板引擎会用传入的值替换这些变量,传值的代码写在/myproject/myapp/views.py文件中,代码如下。

from django.shortcuts import render
from django.shortcuts import HttpResponse

# Create your views here.
def index(request):
    return HttpResponse('<h1>hello world</h1>')
def test(request):
    hi='你好,世界'
    test='这是一个测试页,动态页面正常显示'
    return render(request,'test.html',{'hi':hi,'test':test})

1)向HTML文件传递参数,一般用render()函数,代码首先要导入render。
(2)最后一行代码,通过render()函数向test.html传递模板变量(第3个参数),参数是字典类型,注意字典的key的名字一定与HTML文件中模板变量名一致,并用单引号括起来。

模板文件HTML文件写好后,要让Django知道文件位置,需要在setttings.py中设置一下。打开/myproject/myproject/setttings.py,找到TEMPLATES代码块,修改DIRS值,代码如下。

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

在这里插入图片描述

2.2.7 配置静态文件存放位置

网页可以引用图像、音/视频、CSS、Java Script等形式的文件,使网页更生动,我们把这些文件存放在一个文件夹中,即静态文件夹。与2.3.6节同理,要让Django找到这些文件必须进行设置,首先在setttings.py文件的INSTALLED_APPS代码块中要有“‘django.contrib.staticfiles’,”这一行代码,如下所示。

STATIC_URL = '/static/'
STATICFILES_DIRS=(os.path.join(BASE_DIR,'static'),)

STATIC_URL是静态文件夹前缀,STATICFILES_DIRS中的是静态文件目录列表。我们以下面的配置为例做出解释。

STATIC_URL = '/static/'
STATICFILES_DIRS(
'c:/test1/static1/',
'c:/test2/static2/',
'c:/test3/static3/',)

假如HTML文件中有< script src="/static/jquery-2.2.0.min.js"></ script>这一句引用Java Script文件的语句,这个语句中src以/static/开头。Django在查找jquery-2.2.0.min.js这个文件时,会在c:/test1/static1/、c:/test2/static2/、c:/test3/static3/这3个文件夹中去查找。所以说STATIC_URL的值/static/是一个路径前缀,可以理解为一个别名,它代表着STATICFILES_DIRS中列出的文件夹。
我们设置静态文件os.path.join(BASE_DIR,‘static’),它的真实值就是/myproject/ static/。因此需要在/myproject/下新建文件夹static,将网页要引用的静态文件或相关文件夹保存在这里,如与Bootstrap相关的CSS、Java Script文件等

<!DOCTYPE html>
<!-- 导入静态文件相关模块以及相关设置 -->
{% load static %}
<!-- 设置浏览器用的字符集是简体中文 -->
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>登录界面</title>
    <link href="{% static 'bootstrap/css/bootstrap.min.css' %}" rel ="stylesheet">
    <link href="{% static 'fontawesome/css/font-awesome.min.css' %}" rel ="stylesheet">
    <script src="{% static 'jquery-3.3.1.js' %}"></script>
</head>
<body>
<div class="container">
    <form class="form-signin" method="post"action="">
        {% csrf_token %}
        <h2 class="form-signin-heading">请登录</h2>
        <p></p> <p></p>
        <label for="username" class="sr-only">用户名</label>
        <input type="text" id="username"name="username" class="form-control"placeholder="用户" requiredautofocus>
        <p></p><p></p>
        <label for="password" class="sr-only">密 码</label>
        <input type="password" id="password" name="password" class="form-control"placeholder="密码" required>
        <button class="btn btn-lg btn-primary btn-block" type="submit">登录</button>
    </form>
</div> <!-- /container -->
</body>
</html>

上述代码的相关说明如下。

  1. {% name %}这种形式的标签称为模板标签,可以实现与函数、代码语句相似的功能,后续章节将详细介绍。
  2. {% load static %}表示HTML文件要加载静态文件的相关设置。例如< link href="{% static’bootstrap/css/bootstrap.min.css’ %}“rel=“stylesheet”>这句代码会被Django渲染成< link href=”/static/bootstrap/css/bootstrap.min.css" rel=“stylesheet”>形式,这样就指向静态文件的位置,而渲染后路径中的/static/是个前缀,与settings.py中STATICFILES_DIRS变量结合起来形成要查找的路径。
  3. {% csrf_token %}涉及防止跨站请求伪造以及中间件的相关内容,这些Django都为我们设计好了,可直接使用,后续章节将详细介绍。
  4. < form class=“form-signin"method=“post” action=”">的重点在method属性,这涉及网页提交的方式,最常用的有get和post两种。简单地说,get一般用于请求数据,post一般用于表单提交数据。

接下来编写登录页面业务逻辑代码,打开/myproject/myapp/views.py,增加以下代码。

from django.shortcuts import render,HttpResponse,redirect
...
def login(request):
    if request.method=="GET":
    #打开Login.html页面
        return render(request,"login.thml")
    else:
    #从表单提取用户名
        username=request.POST.get('username')
    #从表单提取密码
        password=request.POST.get('password')
        if(username=='test' and password=='123'):
            return redirect('/test/')
        else:
            return render(request,"login.html",{'error':'用户名或者密码错误'})

上述代码的相关说明如下。

  • 由于要对载入的HTML文件进行渲染并且要用到页面重定向功能,代码首先导入render和redirect模块。
  • 代码通过if request.method =="GET"判断提交方式。如果是GET,就显示登录页面;如果是POST,就接收提交数据并判断正误,如果正确就定向到测试页面。
  • 注意在HTML文件中method值(如post、get)可以是小写形式,在views.py的代码中method值必须大写形式。
  • 如果用户名与密码都正确,网页定向到测试页面,用return redirect(’/test/’)实现。最后一步添加路由,加上URL与视图函数的对应关系,

在/myproject/myproject/urls.py文件中添加如下路径

path('login/',views.login)

在这里插入图片描述
正确输入用户名与密码,页面进入测试页面

2.2.8 连接数据库

Django可以称作面向数据的开发框架,用命令生成项目与应用程序后,项目根目录下会生成一个默认的数据库db.sqlite3,在settings.py文件中有这个数据库的默认连接

DATABASES = {
    'default': {
    # 数据库引擎,指明数据库类型
        'ENGINE': 'django.db.backends.sqlite3',
    # 指明数据库所在的位置
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

提示:Django可以生成数据库表,不能生成数据库,生成数据库要用到数据库原生命令。

  1. 安装pymsql
    输入命令pip install pymysql;
    在这里插入图片描述
  2. 在MySQL中建立数据库,通过root用户登录,进入MySQL数据库管理界面,用createdatabase mytest命令建立数据库mytest
    在这里插入图片描述
  3. 在settings.py中设置DATABASES代码块,代码如下
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # 数据库引擎,指明数据类型
        'HOST': '127.0.0.1', # 数据库存储在本机
        'PORT':3306, # 端口号
        'USER':'root', #数据库用户名
        'NAME':'mytest', #数据库名称
        'PASSWORD': 'root', # 数据库密码
    }
}
  1. 在/myproject/myapp/models.py中建立数据表,在models.py文件中每个类生成一个数据表,这里生成一个用户信息表User Info,代码如下。
from django.db import models
class UserInfo(models.Model):
    user=models.CharField(max_length=32,verbose_name='姓名')
    email=models.EmailField(verbose_name='邮箱')
    def __str__(self):
        return self.user

上述代码的相关说明如下。(1)第一行代码导入models模块。(2)通过建立User Info类建立User Info数据表。(3)__str__返回模型对象的描述,可以理解为User Info类的实例对象的别名。

  1. models.py中有了代码,它所属的应用程序必须在settings.py的INSTALLED_APPS代码块中注册,代码如下
INSTALLED_APPS = [
	...
    'myapp',
]
  1. 在项目目录/myproject/myproject/init.py中编写以下代码,指明以pymysql模块代替MySQLdb模块,这里要十分注意字母的大小写
import pymysql
pymysql.install_as_MySQLdb()
  1. 运行命令生成数据表,在命令行终端输入以下命令。
    python manage.py makemigrations
    python manage.py migrate
    在这里插入图片描述
    登录MySQL数据库管理界面,可以看到已经生成数据表myaap_userinfo
    在这里插入图片描述

提示:Django生成数据表时会把models.py中的类名转成小写,然后在前面加上应用程序的名字和下划线,如“myapp_userinfo”。以auth_和django_开头的数据表是Django自动生成的系统表,后台管理系统会用到这些表。

2.2.9 Django 后台管理系统

注册数据库表,在/myproject/myapp/admin.py中注册models.py生成的数据表,代码如下

from django.contrib import admin
from .models import UserInfo
# 注册数据表
# 自定义数据模型在后台的显示样式
class UserInfoAdmin(admin.ModelAdmin):
    # 指明在Django Admin管理后台列表模式下显示哪几个字段
    list_display=('user','email')
    admin.site.register(UserInfo)

上述代码的相关说明如下。

  1. list_display表示数据列表展示时,显示哪些字段
  2. admin.site.register()函数表示:如果只有一个参数,以默认方式在后台显示或管理数据表;如果有第二个参数,就按第二个参数传入的类定制的方式显示和管理数据表。

为了使后台管理系统用中文显示,需要在settings.py中修改LANGUAGE_CODE、TIME_ZONE两个变量,修改的值如下。

LANGUAGE_CODE = 'zh-hans'  # 语言格式TIME_ZONE = 'Asia/Shanghai' # 设置时区

创建后台管理超级用户,需在命令行终端输入python manage.py createsuperuser命令,按提示输入用户名、电子邮箱地址、密码等相关信息
在这里插入图片描述
用新建的超级用户的用户名和密码登录,进入后台管理系统。
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zyw2002

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值