每天努力一点点,坚持下去 ------ 博客首页

Django基础(1)

一、开发模式

MVC模式:

  • model:数据库
  • view:前端展示
  • controller:逻辑控制

MTV模式(Django):

  • model:数据库
  • view:逻辑控制
  • template:前端展示(模板)

前后端分离 与 不分离 模式,请求过程:

前后端不分离:每次都需要打开整个Html进行替换

前后端分离:只需要后端获取到数据返回后,在页面把所需替换的变量进行替换,不需要每次都打开整个Html

由此我们可以了解到:前后端分离的性能会更加好些

二、Django介绍

  1. 重量级服务端开发接口框架
  2. flask、FastAPI 轻量级的服务端开发框架
  3. ORM:封装了数据库操作(无需使用SQL)
  4. form:校验请求数据(无需写代码校验)

安装Django:

pip install django==2.1   #指定版本安装,默认是安装最新版本

 注意:最新版本的Django对mysql版本也有要求

如报错:TypeError: argument of type ‘WindowsPath’ is not iterable,需在 setting.py 找到 DATABASES 中的 NAME,value调整为:str(BASE_DIR / 'db.sqlite3')即可。

三、Django命令

 1.创建项目命令

django-admin startproject ssz_django

 2.启动项目命令

python manage.py runserver   #默认端口启动8000

python manage.py runserver  0.0.0.0:8002    #指定端口启动,别人也可以访问

python manage.py runserver  127.0.0.1:8002  #指定端口启动,只能自己访问

 页面启动方式:

点击可进入Pycharm命令模式:

验证是否启动:

3.项目中创建子模块

首先需要 cd 进入到manage.py 的当前目录下

python manage.py startapp user

4.创建表结构

首先需要在model是操作数据库的,在model.py下写表结构,Django中默认的是db.sqlite3数据库,然后在执行以下的命令
python manage.py makemigrations   #在migrations文件下:生成建表/更新表的py文件

python manage.py migrate   #根据上面命令生成的py文件,来建表/更新表

 进入Navicat中连接

Pycharm中数据库打开(第一次连接需要下载插件):

5.查看所有命令行

python manage.py --help

四、pycharm页面中创建Django项目

pycharm创建子模块:

Tools--Run manage.py Task   #进入命令行

startapp user  #创建user子模块

五、Django项目介绍

1 、项目整体结构

 创建流程

2、settings.py

——配置文件,配置数据库连接等

初始化时需修改:

  1. TIME_ZONE默认是标准时区,更改为东八区时区,TIME_ZONE = 'Asia/ShangHai'
  2. USE_TZ默认是Ture,更改为USE_TZ = False,不修改,插入数据时,依旧是标准时区的时间
  3. LANGUAGE_CODE = 'en-us'页面显示是英文,更改为:LANGUAGE_CODE = 'zh-Hans',会显示为中文
  4.    如是【命令行创建】:TEMPLATES中 DIRS需要加上templates的路径:BASE_DIR / 'templates'
import os
from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

# BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# print(BASE_DIR)

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-+atw*_yf*lmcifvr%wxpe04d19)&-9sqidqh8@36c5^_&k6&!$'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []

# Application definition

# 我们创建了哪些子项目要在这里添加,不然如数据库的类不会帮创建
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'sky.apps.SkyConfig',
    'user',  # 与sky.apps.SkyConfig'没区别
    'case',
    'test_tools'
]

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

ROOT_URLCONF = 'Django学习.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates']  # 指的是django寻找html模板的目录
        ,
        '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',
            ],
        },
    },
]

WSGI_APPLICATION = 'Django学习.wsgi.application'

# Database
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases

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

# Password validation
# https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

# Internationalization
# https://docs.djangoproject.com/en/4.1/topics/i18n/

# 页面显示为英文:LANGUAGE_CODE = 'en-us'

# 页面显示为中文,更改后,不需要重启,会自动的重启
LANGUAGE_CODE = 'zh-Hans'

# 时区,UTC表示标准时区,需要更改为我们属于的东八区:Asia/Shanghai
TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_TZ = False  # True是标准时间,不修改,插入数据时,依旧是标准时区的时间,需要更改为Fase

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

STATIC_URL = 'static/'

# Default primary key field type
# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

# 自加:静态文件
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),  # 元组,每次需要加逗号
)

 默认使用sqlite数据库,如用mysql数据库,除了在DATABASES配置mysql数据库外,还需在与settings.py文件同级的__init__.py里增加以下代码才可用:

import pymysql
pymysql.install_as_MySQLdb()

3、urls.py

——配置Url,所有的都会在这配置

from django.contrib import admin
from django.urls import path
from user.views import *  # 引入views自写模块

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', user_info),  # 第一个参数:路径  第一个参数:接口的函数名
    path('welcome/', welcome),
    path('', index)  # 第一个参数什么也不写,代表在根目录下
]

4、wsgj.py

用来部署到生产环境

"""
WSGI config for Django学习 project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/4.1/howto/deployment/wsgi/
"""

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Django学习.settings')

application = get_wsgi_application()

5、manage.py

用来管理这个项目,如:启动项目呢、修改表结构

#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys


def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Django学习.settings')
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == '__main__':
    main()

6、views.py

编写项目逻辑

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


# Create your views here.

def user_info(request):  # request是获取请求的返回值
    s = 'Hello'
    return HttpResponse(s)  # 不可以直接返回字符串,需要是HttpResponse;返回的是字符串使用HttpResponse(接口返回的可使用)


def welcome(request):
    username = 'qiaofeng'  # request返回
    username_zh = '乔峰==='  # sql查询到

    # render:需返回Html使用;所做:把参数进行替换
    # 第一个参数:接口返回值,第二个参数:前端文件名称,第三个参数:可传递给前端(必须是dict)
    return render(request, 'welcome.html', {'username_zh': username_zh})
render在做的事情:
    f = open(r'C:\Users\xxx\welcome.html', encoding='utf-8')
    content = f.read()
    new_content = content.replace('{{ username }}', username_zh)
    return HttpResponse(new_content)

7、tests.py

单元测试代码(需要手动加入Django配置,才可以测试)

运行Django项目时,不需要手动设置,因为在manager.py文件中配置了

from django.test import TestCase
import os, django

# Create your tests here.

# 正常启用manage不需要有以下2行的操作,因为manage.py会启动;目前是普通的py文件,就需要加一下
# 告知django的配置文件路径
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Django学习.settings')
# 设置下配置文件
django.setup()

from user import models  # 这个导入不可以放在最上边,因需要先执行下上边2行代码才可以

#
# 方法1
category = models.Category(name='Python')
category.save()

# 方法2
# 不需要.save
models.Category.objects.create(name='linux')

#
c1 = models.Category.objects.get(id=1)  # 只可以返回一条,返回多条时会报错
print(c1)  # 直接取的是一个对象:Category object (1)
print(c1.name)  # 获取到value:Python

8、models.py

操作数据库,默认的是使用SQLite,Python内置了SqLite,无需安装额外的,如在Pycharm中第一次连接数据库,下载插件即可:

from django.db import models

# Create your models here.

class Article(models.Model):  # models.Model继承后才是数据库的一个类
    # 定义表: 表名、类型
    title = models.CharField(verbose_name='标题', max_length=25)
    # default:默认的标题是什么;blank=True:字段可以为空
    # CharField对应数据库中的:varchar,必须写最长的长度;verbose_name:对应的中文名;max_length:最大的长度
    content = models.TextField(verbose_name='文章内容', blank=True)  # TextField:长文本类型,不需要指定max_lticength
    img = models.ImageField(upload_to='static')  # ImageField:图片类型     upload_to:指定下路径
    create_time = models.DateTimeField(verbose_name='创建时间',
                                       auto_now_add=True)  # auto_now_add=True:只有在创建的时候会自动的加上时间,不会在变
    update_time = models.DateTimeField(verbose_name='修改时间', auto_now=True)  # auto_now=True修改时会自动的加上时间
    models.ForeignKey()  # 外键,一对多的时候会用到

    class Meta:
        db_table = 'category'  # 定义表名,如果不定义表名默认生成的表名是“子项目名+定义的类名”
        ordering = ['-create_time']  # 按什么排序,默认是升序,如果想要降序就加一个-号
        verbose_name = '文章分类'  # 加上这个后台管理页面表名显示为中文,设置verbose_name主要是为了在后台管理页面展示为中文,方便操作。
        verbose_name_plural = verbose_name  # 英文是有复数的中文没有,加上这个中文后就不显示s了。如果就想显示英文,注释这两行即可。

        def __str__(self):  # 不加查询数据时显示的是数据对象,加了后,查询可显示数据的value值
            return self.name


class Category(models.Model):
    name = models.CharField(verbose_name='分类名称', max_length=20)
    create_time = models.DateTimeField(verbose_name='创建时间',
                                       auto_now_add=True)  # auto_now_add=True:只有在创建的时候会自动的加上时间,不会在变
    update_time = models.DateTimeField(verbose_name='修改时间', auto_now=True)  # auto_now=True修改时会自动的加上时间

9、apps.py

应用的配置

 

10、admin.py

自带的后台管理

 

11、migrations文件夹

创建表相关

 

12、项目所在目录同名的文件夹

配置文件:数据库等都在此配置

 13、templates

  • django寻找html模板的目录
  • 也可不是templates为文件名

 

 14、新增static文件

前端静态文件

 


 

posted @ 2023-01-12 10:20  他还在坚持嘛  阅读(41)  评论(0编辑  收藏  举报