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配置,才可以测试