Django 是一个用于构建 Web 应用程序的高级 Python Web 框架
Django 版本要对应的 Python 版本
1.8 2.7, 3.2 , 3.3, 3.4, 3.5 1.9, 1.10 2.7, 3.4, 3.5 1.11 2.7, 3.4, 3.5, 3.6 2.0 3.4, 3.5, 3.6, 3.7 2.1, 2.2 3.5, 3.6, 3.7 3.2 3.6, 3.7, 3.8, 3.9, 3.10 4.0 3.8, 3.9, 3.10 4.1 3.8, 3.9, 3.10, 3.11 (added in 4.1.3) 4.2 3.8, 3.9, 3.10, 3.11, 3.12 (added in 4.2.8)
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', ], }, }, ]
TestModel 为app的名称
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'TestModel', # 添加TestModel(即创建的app的名称) )
注销原有数据库,修改为现在使用的数据库配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 数据库引擎 'NAME': 'runoob', # 数据库名称 'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1 'PORT': 3306, # 端口 'USER': 'root', # 数据库用户名 'PASSWORD': '123456', # 数据库密码 } }
from django.db import models class Test(models.Model): name = models.CharField(max_length=20)
添加数据需要先创建对象,然后再执行 save 函数,相当于SQL中的INSERT
from django.http import HttpResponse from TestModel.models import Test # 数据库操作 def testdb(request): test1 = Test(name='runoob') test1.save() return HttpResponse("<p>数据添加成功!</p>")
from django.http import HttpResponse from TestModel.models import Test # 数据库操作 def testdb(request): # 初始化 response = "" response1 = "" # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM list = Test.objects.all() # filter相当于SQL中的WHERE,可设置条件过滤结果 response2 = Test.objects.filter(id=1) # 获取单个对象 response3 = Test.objects.get(id=1) # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2; Test.objects.order_by('name')[0:2] #数据排序 Test.objects.order_by("id") # 上面的方法可以连锁使用 Test.objects.filter(name="runoob").order_by("id") # 输出所有数据 for var in list: response1 += var.name + " " response = response1 return HttpResponse("<p>" + response + "</p>")
修改数据可以使用 save() 或 update()
from django.http import HttpResponse from TestModel.models import Test # 数据库操作 def testdb(request): # 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE test1 = Test.objects.get(id=1) test1.name = 'Google' test1.save() # 另外一种方式 #Test.objects.filter(id=1).update(name='Google') # 修改所有的列 # Test.objects.all().update(name='Google') return HttpResponse("<p>修改成功</p>")
删除数据库中的对象只需调用该对象的delete()方法即可
from django.http import HttpResponse from TestModel.models import Test # 数据库操作 def testdb(request): # 删除id=1的数据 test1 = Test.objects.get(id=1) test1.delete() # 另外一种方式 # Test.objects.filter(id=1).delete() # 删除所有数据 # Test.objects.all().delete() return HttpResponse("<p>删除成功</p>")
暂无
可以使用通配符
from django.urls import re_path # 用re_path 需要引入 urlpatterns = [ path('admin/', admin.site.urls), path('index/', views.index), # 普通路径 ]
from django.shortcuts import render,redirect,HttpResponse def web(request): if request.method == 'GET': name = request.GET.get('name') password = request.GET.get('password') if request.method == 'POST': name = request.POST.get('name') password = request.POST.get('password')
def web_render(request): return render(request, 'shop/user_reg.html', {"form_obj": form_obj}) def web_redirect(request): return redirect('/your_url/{}/'.format(post.id)) def web_HttpResponse(request): return HttpResponse("hello")
我们知道前后端常用json数据结构交互, 在后端我们常想把一个对象返回给前端,但是json序列化是不能序列化对象(不过可以添加序列化参数encoder序列化原理和序列化组件差不多需要自己定义序列化类和返回的结构),所以就有了我们的序列化组件,可以自定义特定结构把对象序列化返回给前端,同时可以对前端传入的参数进行数据校验等功能。
from django.core import serializers #序列化 def web_login(request): if request.method == 'GET': page = int(request.GET.get('page')) result = serializers.serialize("json", models.ComicMain.objects.filter(id__range=[page,page+12]).all()) nums = models.ComicMain.objects.count() # 登录成功 backdata["code"] = 200 backdata["msg"] = "登录成功" backdata["nums"] = nums backdata["data"] = result return HttpResponse(json.dumps(backdata))
Django 提供了基于 web 的管理工具,在项目的 settings.py 中的 INSTALLED_APPS 查看
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', )
通常我们在生成项目时会在 urls.py 中自动设置好,我们只需去掉注释即可
启动开发服务器,然后在浏览器中访问 http://127.0.0.1:8000/admin/
python manage.py createsuperuser
Username (leave blank to use 'root'): admin
Email address: admin@runoob.com
Password:
Password (again):
Superuser created successfully.
为了让 admin 界面管理某个数据模型,我们需要先注册该数据模型到 admin。比如,我们之前在 TestModel 中已经创建了模型 Test 。修改 TestModel/admin.py
from django.contrib import admin from TestModel.models import Test # Register your models here. admin.site.register(Test)
Django Form 组件用于对页面进行初始化,生成 HTML 标签,此外还可以对用户提交的数据进行校验(显示错误信息)。 报错信息显示顺序:
● 先显示字段属性中的错误信息,然后再显示局部钩子的错误信息。
● 若显示了字段属性的错误信息,就不会显示局部钩子的错误信息。
● 若有全局钩子,则全局钩子是等所有的数据都校验完,才开始进行校验,并且全局钩子的错误信息一定会显示。
from django import forms
# 认证模块 from django.contrib import auth # 对应数据库 from django.contrib.auth.models import User
rep = HttpResponse(json.dumps(backdata)) rep.set_cookie(key,value,...) rep.set_cookie("_id",encryptdata,expires=3600) rep.set_signed_cookie(key,value,salt='加密盐',...)
提示
tip: cookies要设置过期时间
request.COOKIES.get(key)
rep =HttpResponse || render || redirect rep.delete_cookie(key) 8.14 操作cookie实例 def login(request): if request.method == "GET": return render(request, "login.html") username = request.POST.get("username") password = request.POST.get("pwd") user_obj = models.UserInfo.objects.filter(username=username, password=password).first() print(user_obj.username) if not user_obj: return redirect("/login/") else: rep = redirect("/index/") rep.set_cookie("is_login", True) return rep def index(request): print(request.COOKIES.get('is_login')) status = request.COOKIES.get('is_login') # 收到浏览器的再次请求,判断浏览器携带的cookie是不是登录成功的时候响应的 cookie if not status: return redirect('/login/') return render(request, "index.html") def logout(request): rep = redirect('/login/') rep.delete_cookie("is_login") return rep # 点击注销后执行,删除cookie,不再保存用户状态,并弹到登录页面 def order(request): print(request.COOKIES.get('is_login')) status = request.COOKIES.get('is_login') if not status: return redirect('/login/') return render(request, "order.html")
request.session["key"] = value request.session.set_expiry(3600) #设置过期时间
提示
tip: session要设置过期时间
request.session.get('key')
删除整条记录(包括 session_key、session_data、expire_date 三个字段):
request.session.flush()
删除 session_data 里的其中一组键值对:
del request.session["key"]
Django 中间件是修改 Django request 或者 response 对象的钩子,可以理解为是介于 HttpRequest 与 HttpResponse 处理之间的一道处理过程。
Django 中间件作用:
● 修改请求,即传送到 view 中的 HttpRequest 对象。
● 修改响应,即 view 返回的 HttpResponse 对象。
中间件组件配置在 settings.py 文件的 MIDDLEWARE 选项列表中。 配置中的每个字符串选项都是一个类,也就是一个中间件。
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', ]
中间件可以定义四个方法,分别是:
process_request(self,request)
process_view(self, request, view_func, view_args, view_kwargs)
process_exception(self, request, exception)
process_response(self, request, response)
在 app 目录下新建一个 py 文件,名字自定义,并在该 py 文件中导入
MiddlewareMixin: from django.utils.deprecation import MiddlewareMixin
自定义的中间件类,要继承父类 MiddlewareMixin:
class MD1(MiddlewareMixin): pass
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', 'app01.middlewares.MD1', ]
class MD1(MiddlewareMixin): def process_request(self, request): print("md1 process_request 方法。", id(request)) #在视图之前执行 def process_response(self,request, response): :#基于请求响应 print("md1 process_response 方法!", id(request)) #在视图之后 return response def process_view(self,request, view_func, view_args, view_kwargs): print("md1 process_view 方法!") #在视图之前执行 顺序执行 #return view_func(request) def process_exception(self, request, exception):#引发错误 才会触发这个方法 print("md1 process_exception 方法!") # return HttpResponse(exception) #返回错误信息