一、Django介绍
flask,FastApi是轻量级服务端开发框架
Django是重量级服务端开发框架
ORM:封装了数据库操作
form:校验请求数据
安装Django:
pip install django==2.1.7 #指定版本安装,默认是安装最新版本
注意:最新版本的Django对mysql版本也有要求
二、Django命令
1.创建项目命令:django-admin startproject test_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 指定端口启动,只能自己访问
3.创建子模块:python manage.py startapp user
4.创建表结构:
python manage.py makemigrations #生成建表/更新表的py文件
python manage.py migrate #根据上面命令生成的py文件,来建表/更新表
三、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('get_sign', views.get_sign), path('category_view', views.category_view), path('category/<int:id>', views.category), path('article/<int:id>', views.detail), ]
3.3 settings.py
该文件是配置文件,数据库等配置
import os # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = '^28j+9pchzsrhs0w1p5n9hz+bp&4)dek8n8zd1+y0e+g4vvpxb' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = ['*'] #设置允许那些ip可以进行访问,如果允许所有,则写成['*'] # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'user', 'order' ] 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')], '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/2.1/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } # 数据库配置 # Password validation # https://docs.djangoproject.com/en/2.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/2.1/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/2.1/howto/static-files/ STATIC_URL = '/static/' STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] # 设置静态文件目录
3.4 wsgj.py
该文件是用来部署用的
3.5 manage.py
项目管理文件
3.6 models.py
操作数据库文件
from django.db import models # Create your models here. # 创建表结构的地方 class BasicModel(models.Model): create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True) update_time = models.DateTimeField(verbose_name='修改时间', auto_now=True) class Meta: abstract = True class Category(BasicModel): name = models.CharField(verbose_name='分类名称',max_length=50,unique=True) class Meta: db_table = 'category' verbose_name = '文章分类' # 在admin后台显示表名 verbose_name_plural = verbose_name # 在admin后台显示表名的复数形式 ordering = ['id'] # 根据某些字段进行升序排序 # ordering = ['-id'] # 有- 根据某些字段进行降序排序 # 定义下面的函数实现在admin后台中展示字段,从而代替展示的 tablename objects def __str__(self): return self.name class Article(BasicModel): title = models.CharField(verbose_name='文章标题', max_length=50) content = models.TextField(verbose_name='文章内容') # 长文本 read_count = models.IntegerField(verbose_name='阅读次数', default=0) category = models.ForeignKey(Category, on_delete=models.PROTECT, verbose_name='分类') class Meta: db_table = 'article' verbose_name = '文章' verbose_name_plural = verbose_name def __str__(self): return self.title
代码写好后,分别执行以下命令,就可以生成表结构
python manage.py makemigrations
python manage.py migrate
Django 内嵌了sqllite,默认就是将表创建在sqllite中
如果想要连接mysql等其他数据库,需要自己在settings.py文件中配置
关联删除模式:
#外键删除操作模式 #models.DO_NOTHING:不受任何影响 #models.CASCADE:关联的数据也会被删除,分类被删除,引用分类的文章也会被删除 #models.SET:传入一个方法名,用方法逻辑处理 #models.SET_DEFAULT:删除了,设置为默认值,要该字段有默认值 #models.SET_NULL:删除了,直接设置为空,要该字段可为空 #models.PROTECT#受保护,不能删除,只要这个分类下有文章,就不能删除这个分类
3.7 views.py
是用来做逻辑处理的文件
from django.shortcuts import render from django.shortcuts import HttpResponse from . import models # Create your views here. # 写逻辑的地方 def index(request): # return HttpResponse('hello django!') categories = models.Category.objects.all() articles = models.Article.objects.all() title = 'my blog' return render(request, 'index.html', {'title': title, 'categories': categories, 'articles': articles}) # 第三个参数,把值传到html页面上 def get_sign(request): print(request.method) # 请求方式 print(request.body) # 请求体 print(request.META) # 请求头 print(request.GET) # url里面的参数都在GET url? a=1&b=2 print(request.POST) # POST中的参数 k-v,k1=v1 print(request.FILES) # 文件 print(request.COOKIES) # cookies return HttpResponse('sign') def category_view(request): c = models.Category.objects.all() # 查询所有的数据 for i in c: print(i.name) print(i.create_time) print(i.update_time) print('=====================') s = models.Category.objects.get(id=3) # 使用get,必须要保证返回的只有1条结果 print(s.name) f = models.Category.objects.filter(name='java', id=3) # 进行过滤,返回多条结果 result = models.Category.objects.filter(name='mysql').exists() # 使用过滤后,利用exists方法判断是否存在 print(result) result = models.Category.objects.filter(name='java').count() # 使用过滤后,利用count方法统计返回条数 print(result) return HttpResponse('ok') def category(request, id): categories = models.Category.objects.all() articles = models.Article.objects.filter(category_id=id) # print(articles.first()) # 返回第一个 # print(articles.last()) # 返回最后一个 return render(request, 'category.html', {'articles': articles, 'categories': categories}) def detail(request,id): article = models.Article.objects.get(id=id) counts = article.read_count counts += 1 return render(request, 'detail.html', {'article': article, 'counts': counts})
3.8 ORM操作数据库
def category_view(request): c = models.Category.objects.all() # 查询所有的数据 for i in c: print(i.name) print(i.create_time) print(i.update_time) print('=====================') s = models.Category.objects.get(id=3) # 使用get,必须要保证返回的只有1条结果 print(s.name) f = models.Category.objects.filter(name='java', id=3) # 进行过滤,返回多条结果 result = models.Category.objects.filter(name='mysql').exists() # 使用过滤后,利用exists方法判断是否存在 print(result) result = models.Category.objects.filter(name='java').count() # 使用过滤后,利用count方法统计返回条数 print(result) return HttpResponse('ok')
5.9 test.py
测试代码
注意:需要手动加入Django配置,才可以测试