Django基础篇 01- 初识Django

一、Django介绍

flask,FastApi是轻量级服务端开发框架

Django是重量级服务端开发框架

ORM:封装了数据库操作

form:校验请求数据

安装Django:

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

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

二、Django命令

1.创建项目命令:

django-admin startproject xxx

2.启动项目命令:

  python manage.py runserver  默认端口启动8000
  python manage.py runserver  0.0.0.0:8002   指定端口启动,别人也可以访问
  python manage.py runserver  127.0.0.1:8002 指定端口启动,只能自己访问

3.创建子模块:

python manage.py startapp user

4.创建表结构:

    python manage.py makemigrations  #生成表结构(py) 只生成 建表的代码文件 不创建表
    python manage.py makemigrations user #只生成user app的表结构(py)
    python manage.py migrate  #同步到数据库

5.创建后台管理用户admin:

python manage.py createsuperuser #创建后台管理的admin用户

三、Django项目介绍

3.1 项目整体结构

 3.2 urls.py====> 该文件是用来配置url的

from django.contrib import admin
from django.urls import path
from user import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index',views.index),
    path('',views.get_sign),
    path('category/<int:id>',views.category),
    path('detail/<int:article_id>',views.detail)
]

3.3 settings.py====>该文件是配置文件,数据库等配置

"""
Django settings for sky project.

Generated by 'django-admin startproject' using Django 3.2.6.

For more information on this file, see
https://docs.djangoproject.com/en/3.2/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.2/ref/settings/
"""
import os
from pathlib import Path

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


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

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-&9dmdfb5o_3ckyzo$s)b(-b37%x!f3l3jb7n+ukji5)$avh216'

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

ALLOWED_HOSTS = ['*']    #配置允许哪些ip访问的  *允许所有的


# Application definition

INSTALLED_APPS = [
    'simpleui',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'user',
    'order'
]  #app注册

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 = 'sky.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates')],   # 这里设置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',
            ],
        },
    },
]  # 设置模板的 前后端不分离的时候它有用

WSGI_APPLICATION = 'sky.wsgi.application'


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

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR,'db.sqlite3'),
    }
}  #配置数据库的地方 默认是sqlite3


# Password validation
# https://docs.djangoproject.com/en/3.2/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/3.2/topics/i18n/

LANGUAGE_CODE = 'zh-Hans'  # 设置语言,'en-us':英文,'zh-Hans':中文

TIME_ZONE = 'Asia/Shanghai'    # 设置时区,'UTC':标准时区 格林威治时间,'Asia/Shanghai':亚洲上海时区

USE_I18N = True

USE_L10N = True

USE_TZ = False  # 设置是否使用标准时区时间,我们设置为False  不适用标准时区


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

STATIC_URL = '/static/'

# 设置静态文件目录
STATICFILES_DIRS = (
    os.path.join(BASE_DIR,'static'),
)

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

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

3.4 wsgj.py====>该文件是用来部署用的

3.5 manage.py====> 项目管理文件

3.6 models.py====>操作数据库文件

from django.db import models

# Create your models here.

class BaseModel(models.Model):
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')

    class Meta:
        abstract = True  # 抽象基类  此模型 不会创建表


class Category(BaseModel):
    name = models.CharField(max_length=50,verbose_name='分类名称',unique=True,null=False)


    class Meta:
        db_table = 'category'       # 表名
        verbose_name = '文章分类'
        verbose_name_plural = verbose_name
        ordering = ['-create_time']

    def __str__(self):
        return self.name

class Article(BaseModel):
    title = models.CharField(max_length=100,verbose_name='文章标题')
    content = models.TextField(verbose_name='文章内容')     # 长文本内容
    read_count = models.IntegerField(default=0,verbose_name='阅读次数')
    category = models.ForeignKey(Category,on_delete=models.PROTECT,verbose_name='文章分类')      # 外键

    """
        models.DO_NOTHING   删除父表 不影响子表
        models.CASCADE      删除父表  同时删除子表
        models.SET_DEFAULT  删除父表  子表相关字段设置默认值
        models.SET_NULL     删除父表  子表相关字段设置为空
        models.PROTECT      受保护的,父表存在子表,则不能删除父表
        models.SET          自定义模式,自己指定
    """

    class Meta:
        db_table = 'article'    # 表名
        verbose_name = '文章'     # web展示的别名
        verbose_name_plural = verbose_name
        ordering = ['-create_time']
    def __str__(self):          # 修改类对象的输出内容 默认输出对象属于的类和 此对象的内存地址
        return self.title

代码写好后,分别执行以下命令,就可以生成表结构

 python manage.py makemigrations

 python manage.py migrate

Django 内嵌了sqllite,默认就是将表创建在sqllite中

navicate 访问sqlite配置

 

 

 

 关联删除模式:

    """
        models.DO_NOTHING   删除父表 不影响子表
        models.CASCADE      删除父表  同时删除子表
        models.SET_DEFAULT  删除父表  子表相关字段设置默认值
        models.SET_NULL     删除父表  子表相关字段设置为空
        models.PROTECT      受保护的,父表存在子表,则不能删除父表
        models.SET          自定义模式,自己指定
    """

3.7 views.py===>接收接口请求的处理逻辑 并返回响应

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

from hashlib import md5

# Create your views here.
from . import models


def sign(s):
    news = 'abcdefg'+ s
    return md5(news.encode()).hexdigest()

def index(request):
    title = 'my blog'
    categories = models.Category.objects.all()
    articles = models.Article.objects.all()

    return render(request,'index.html',{'title':title,'categories':categories,'articles':articles})

def category(request,id):  #categoryid
    articles = models.Article.objects.filter(category_id=id)
    categories = models.Category.objects.all()
    return render(request,'category.html',{'articles':articles,'categories':categories})

def detail(request,article_id):
    article = models.Article.objects.get(id=article_id)
    article.read_count += 1
    article.save()
    article = models.Article.objects.get(id=article_id)
    return render(request,'detail.html',{'article':article})

def get_sign_01(request):
    print(request.method)   # 请求方式
    print(request.body)     # 请求body
    print(request.META)     # 请求头
    print(request.GET)      # url里面的参数都到GET url?1= 1 & b=2
    print(request.POST)     # k-v k1-v1
    print(request.FILES)    # 文件
    print(request.COOKIES)  # cookies
    # print(dir(request))
    return HttpResponse("sign")

def get_sign(request):

    s = request.GET.get('str')
    data = {"code":0,"data":sign(s)}

    return JsonResponse(data)

def category_view(request):

    # 查询
    # c = models.Category.objects.all()   # 查询所有的数据
    # for i in c:
    #     print(i.name)
    #     print(i.id)
    #     print(i.create_time)
    #     print(i.update_time)
    # c = models.Category.objects.get(name = 'JAVA')   # 查询一条数据  需要保证查询结果为一条
    # print(c.name)
    #
    # f = models.Category.objects.filter(name='JAVA',id = 3)     # 可以返回多条 返回是list类型 多个条件是 且 关系
    # print(f)
    #
    # result = models.Category.objects.filter(name = 'mysql').exists()    # 判断查询结果是否存在 存在为True 否则为False
    #
    # print(result)
    #
    # count = models.Category.objects.filter(name = 'JVM').count()    # 获取查询结果数量
    # print(count)

    c = models.Category.objects.get(id = 3)
    print(c.article_set.count())

    return HttpResponse("OK")

3.8 ORM操作数据库  

def category_view(request):

    # 查询
    c = models.Category.objects.all()   # 查询所有的数据
    for i in c:
        print(i.name)
        print(i.id)
        print(i.create_time)
        print(i.update_time)
    c = models.Category.objects.get(name = 'JAVA')   # 查询一条数据  需要保证查询结果为一条
    print(c.name)

    f = models.Category.objects.filter(name='JAVA',id = 3)     # 可以返回多条 返回是list类型 多个条件是 且 关系
    print(f)

    result = models.Category.objects.filter(name = 'mysql').exists()    # 判断查询结果是否存在 存在为True 否则为False

    print(result)

    count = models.Category.objects.filter(name = 'JVM').count()    # 获取查询结果数量
    print(count)

    c = models.Category.objects.get(id = 3)
    print(c.article_set.count())

    return HttpResponse("OK")

5.9 test.py

测试代码

注意:需要手动加入Django配置,才可以测试

 

 

posted @ 2021-12-26 21:02  捞铁  Views(100)  Comments(0Edit  收藏  举报