Django - 入门

简介

Django 是一个开放源代码得 Web 应用框架,由Python 写成。最初用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站,即CMS(内容管理系统)软件,于2005年7月在BSD 许可证下发。Django 采用了
MTV 的框架模式,即模型(Model) 、模板(Template) 和 视图(Views),三者之间各自负责不同的职责

  • 模型:数据存取层,处理与数据相关的所有事物,例如如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
  • 模板:表现层,处理与表现相关的决定,例如如何在页面或其他类型的文档中进行显示。
  • 视图:业务逻辑层,存取模型及调取恰当模板的相关逻辑,模型与模板之间的桥梁。

具有以下特点:

  • 对象关系映射
  • URL设计
  • 模板系统
  • 表单处理
  • Cache系统
  • Auth 认证系统
  • 国际化
  • Admin后台系统

搭建项目

# 安装
pip install django

# 命令行创建项目
django-admin startproject djangoDemo

启动方式:
方法一:

方法二:

python manage.py runserver 127.0.0.1:8000

初始项目架构:

  • manage.py: 命令行工具,内置多中方式与项目进行交互。在命令行窗口下,将路径切换到djangoDemo 项目并输入python manage.py help 可以查看该工具的指令信息。
  • setting.py: 项目的配置文件,项目的所有文件都需要在该文件中进行配置
  • urls.py: 项目的路由设置,设置网站的具体网址内容
  • wsgi.py: 用于定义Django使用的socket连接
  • asgi.py: 异步服务网关接口

入门案例

  1. 创建App

完成项目的创建后,接着创建项目应用,项目应用简称为App,相当于网站功能,每个App代表一个网站功能,App的创建由manage.py 实现,创建指令如下:

(venv) PS E:\PyProject\djangoDemo> python manage.py startapp login

执行后会自动生成以下:

  1. 修改setting.py 文件

2.1 修改INSTALLD_APPS 属性

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
     # 新添加
    'login'
]

2.2 修改 TEMPLATES 添加模板的路径

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [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',
            ],
        },
    },
]

3.template\login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/commons.css"/>
</head>
<body>
<h1>用户登录</h1>
<form method="POST" , action="/login/">
    <input type="text" placeholder="用户名" name="username"/><br/>
    <input type="password" placeholder="密码" name="password"/><br/>
    <input type="submit" value="提交"><br/>
    {{ msg}}
</form>
</body>
</html>
  1. login\views.py
from django.shortcuts import render,redirect

# Create your views here.
def login(request):
    '''
    :param request:
    :return:
    '''
    # return HttpResponse('登录成功')
    if request.method == 'GET':
        return render(request, 'login.html')  # 返回HTML文件
    else:
        # form表单提交
        print('表单执行了')
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'root' and password == '123456':
            return HttpResponse('登录成功') 
        else:
            # 账号或者密码错误
            return render(request, 'login.html', {'msg': '账号或密码错误'})   # 返回html文件
  1. djangoDemo\urls.py 配置路由规则
from login import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', views.login)
]

进行验证:

用户访问页面的过程:

  • 当用户在浏览器访问网址的时候,该网址在项目所设置的路由(urls.py) 里找到相应的路由信息
  • 然后从路由信息里找到对应的视图函数(views.py 文件),由视图函数处理用户请求
  • 视图函数将处理结果传递到模板文件(login.html) ,由模板文件生成网页内容,并在浏览器里展现

Django 配置信息

资源文件配置

  1. 资源路由: STATIC_URL

一个项目在开发的过程中肯定需要使用css 和 JavaScript 文件,这些静态文件的存放主要是由配置文件setting.py 配置。Django 默认配置信息如下:

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.1/howto/static-files/

STATIC_URL = '/static/'

默认情况下 Django 无法直接访问项目下所有的静态文件。

例如有以下目录结构:

djangoDemo
      |
    index
      | - static
            | - cow.jpg
      |
    login
      | - static
            |- duck.jpeg
          
      |
    static
      |- dog.jpg

以下连接都无法访问静态资源:
http://localhost:8000/static/cow.jpg
http://localhost:8000/static/duck.jpeg
http://localhost:8000/static/duck.jpeg

  1. 资源集合:STATIC_DIRS
    由于STATIC_URL 的属性性,会在开发中造成诸多不便,比如将静态文件夹存在在项目的根目录以及定义多个静态文件夹等。此时可以借助 STATIC_DIRS属性实现
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
    os.path.join(BASE_DIR, 'index/static'),
    os.path.join(BASE_DIR, 'login/static'),
)

配置完毕所有静态资源都可以使用 :http://localhost:8000/static/xxxx 访问

如果STATIC_URL 发生改变,比如: STATIC_URL = '/Allstatic/',那么访问路径需要更新为:http://localhost:8000/Allstatic/xxxx

  1. 资源部署:STATIC_ROOT

静态资源配置还有 STATIC_ROOT,其作用是在服务器上部署项目,实现服务器和项目之间的映射。STATIC_ROOT 主要收集整个项目的静态资源并存放在一个新的文件夹,然后由该文件夹与服务器之间构建映射关系。

当项目的配置属性DEBUG 设为Ture 的时候,Django 会自动提供静态文件代理服务,此时整个项目处于开发阶段,因此无须使用STATIC_ROOT。当DEBUG设置为False的时候,意味着项目进入生产环境,Django不再提供静态文件代理服务,此时需要在项目的配置文件中设置STATIC_ROOT。

设置STATIC_ROOT需要使用Django操作指令collectstatic 来收集所有静态资源,这些静态资源都会保存在STATIC_ROOT所保存的文件夹里

模板配置

在Web 开发中,模板是一种较为特殊的HTML文档。这个HTML 文档嵌入了一些能够让Django 识别的变量和指令,然后由Django 的模板引擎解析这些变量和指令,生成完整的HTML 网页并返回给用户浏览。模板是Django 里面的MTV 框架模式的T 部分,配置模板路径是告诉Django 在解析模板的时候,如何找到模板所在的位置。创建项目时,Django 已有初始的模板配置信息:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        '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',
            ],
        },
    },
]

模板配置是以列表格式呈现的,每个元素具有不同的含义,其含义说明如下:

  • BACKEND: 定义模板引擎,用于识别模板里面的变量和指令。内置的模板引擎有Django Templates 和 jinja2.jinjia2,每个模板引擎都有自己的变量和指令语法。
  • DIRS: 设置模板所在路径
  • APP_DIRS:是否在App 里查找模板文件
  • OPTIONS: 用于填充在RequestContext 的上下文(模板里面的变量和指令),一般情况下不做任何修改。

案例:当视图返回如下 render 时,html页面如何获取不同数据结构的数据?

def index(request):
    return render(request,
                  'index.html',
                  {
                      'name': 'zhangsan',
                      'hobby': ['code', 'study'],
                      'user_dict': {'k1': 'v1', 'k2': 'v2'},
                      'user_list_dict': [
                          {'id': '1', 'name': 'zhangsan', 'email': '18701439@qq.com'},
                          {'id': '2', 'name': 'zhangsan2', 'email': '18701439@qq.com'},
                          {'id': '3', 'name': 'zhangsan3', 'email': '18701439@qq.com'}
                      ]
                  })

实现:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>模板标记学习</h1>
    <p>{{ name }}</p>
    <p>{{ hobby.0 }}</p>  <!-- 取列表数据 -->
    <p>{{ hobby.1 }}</p>
    <p>{{ user_dict.k1 }}</p>  <!-- 取字典数据 -->
    <p>{{ user_dict.k2 }}</p>
    <p>{{ user_list_dict }}</p>
    <table border="1">
        {% for item in  user_list_dict %}   <!-- 获取里列表中的字典数据:[{},{}] -->
                <tr>
                    <td>{{ item.id }}</td>
                    <td>{{ item.name }}</td>
                    <td>{{ item.email }}</td>
                    <td>
                        <a>编辑</a> | <a>删除</a>
                    </td>
                </tr>

        {% endfor %}
    </table>
</body>
</html>

验证, 访问localhost:8000/index/:

总结:

1.请求返回html 页面需要 render 对象,返回的数据可以通过关键字参数context 传递
2.页面使用后台返回参数采用 {{var}} 的格式

中间件

中间件(Middlerware) 是一个用来处理Django 的请求 和响应 的框架级别的钩子,它是一个轻量、低级别的插件系统,用于在全局范围内改变Django 输入和输出。

Django 接收到用户请求时,首先经过中间件处理请求信息,执行相关处理,然后将处理结果返回给用户。

开发者可以根据自己的需求自定义中间件,只要将自定义的中间件配置到MIDDLERWARE 属性即可激活。

一般情况下,Djanog默认的中间件即可满足大部分开发需求,我们在项目的MIEDDLREWARE 中添加LocaleMieddleware 中间件,使得Django 内置的功能支持中文显示。

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware' # new add
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

MIDDLEWARE 的数据格式为列表,每个中间件的设置顺序是固定的,如果随意变更中间件,就很容易导致程序异常,每个中间件的说明如下:

  • SecurityMiddleware: 内置的安全机制,保护用户与网站的通信安全
  • SessionMiddleware:会话Session 功能
  • LocaleMiddleware:国际化和本地化功能
  • CommonMiddleware:处理请求信息,规范化请求内容
  • CsrfViewMiddleware:开启CRSF防护功能
  • AuthenticationMiddleware:开启内置的用户认证系统
  • MessageMiddleware:开启内置的信息提示功能
  • XFrameOptionsMiddleware:防止恶意程序单击劫持

数据库配置

项目拆跟你讲时默认采用 Sqlite3 数据库,setting.py 中有以下配置:

DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.sqlite3',
         'NAME': BASE_DIR / 'db.sqlite3',
     }
}

下面讲解pymysql 连接 MySQL:

  1. 安装pymysql

  2. 新建空白数据库:django_db

  3. 修改MyDjango\settting.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_db',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '192.168.184.152',
        'PORT': '3306'
    }
}
  1. 初始化连接
# MyDjango\__init__.py

import pymysql
pymysql.install_as_MySQLdb()
  1. 验证安装成功

因为Django 自带内置功能,如Admin后台系统,Auth 用户系统和会话机制等功能,这些功能都需要借助数据表实现,如下指令可以将内置的迁移文件生成数据表:

(venv) PS E:\PyProject\MyDjango>  python manage.py migrat

执行完刷新 数据库:

即执行成功。

遇到的一个问题:
Django提示mysql版本过低:django.db.utils.NotSupportedError: MySQL 8 or later is required (found 5.7.26).

解决:

如果不想麻烦升级数据库版本,可以直接注释相关检查的代码,文件位置: venv/Lib/site-packages/django/db/backends/base/base.py

posted @ 2022-11-05 22:09  chuangzhou  阅读(29)  评论(0编辑  收藏  举报