文章目录
一、中间件
二.后台管理
三.表单组件form的应用
四.表单组件Modelform的应用
五.登陆注册
六.文件上传
七.orm
一、中间件
- 中间件概念
- 如何自定义一个中间件, 四个方法, 单中间件执行顺序
- 多个中间件 中间件中方法执行顺序
- 中间件的应用场景
- 1完成黑名单场景代码书写
- 2使用中间件完成限制频率访问功能
中间件这个术语第一次出现是 1968 年在德国加尔米施帕滕基兴举办的 NATO 软件工程大会结束后发表的一份报告中。这届大会正式确定了"软件工程"的概念,同时还探讨了软件设计、生产和分发等主题
一、中间件是什么?
概述
-
( Middleware)是介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的基础服务(功能), #衔接网络上应用系统的各个部分或不同的应用,能够达到资源共享、功能共享的目的。
-
中间件是为应用提供通用服务和功能的软件。数据管理、应用服务、消息传递、身份验证和 API 管理通常都要通过中间件。
中间件可以帮助开发人员更有效地构建应用。它就如同是应用、数据与用户之间的纽带。
对于具有多云和容器化环境的企业而言,中间件可以助您大规模、经济高效地开发和运行应用。
二、使用步骤
-
1.在项目中创建文件夹
- 创建dictionary命名规范即可
-
2.引入库
-
from django.utlis.deprecation import MiddlewareMixin
3.文件夹下新建py文件写入此代码
:
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 方法 ',id(request)) def process_exception(self,request,exception): print('md1 process_exception 方法 ') return HttpResponse("出现异常")
-
4.添加设置
-
2运行代码随便一个路由获得
-
6.获得运行前后顺序
-
1.多个中间件 中间件中方法执行顺序
完成黑名单场景代码书写
class BlacklistMiddleware(MiddlewareMixin): def get_ip(self, request): if request.META.get('HTTP_X_FORWARDED_FOR'): #它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项,正如上面所述, # 当你使用了代理时web服务器就不知道你的真实IP了,为了避免这个情况,代理服务器通常会增加一个叫做x_forwarded_for的头信息, # 把连接它的客户端IP(即你的上网机器IP)加到这个头信息里,这样就能保证网站的web服务器能获取到真实IP ip = request.META.get('HTTP_X_FORWARDED_FOR') else: ip = request.META.get('REMOTE_ADDR') #表示发出请求的远程主机的 IP 地址,(远程)remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的, # 当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP, # 如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP return ip def process_request(self, request): print('----process request----') ip = self.get_ip(request) print(ip) blacklist = ['127.0.0.2', '127.0.0.2'] if ip in blacklist: return HttpResponse('禁止访问') else: pass
看效果
使用中间件完成限制频率访问功能
#用户访问频率控制 SPACE_TIME = 5 class BlockMiddleware(MiddlewareMixin): def process_request(self,request): current_time = time.time() request_time = request.session.get('request_time') if request_time is not None and current_time - request_time < SPACE_TIME: return HttpResponse("超过访问频率") else: request.session['request_time'] = current_time
看效果
二.后台管理
Django作为一个成熟的Web应用开发框架,其本身已经内置了使用比较友好的后台管理系统,包括数据管理和使用体验良好的界面,这是在众多Web应用开发设计中较为优秀的亮点
一、初始化管理平台
执行数据迁移命令,会看到项目内建的数据库迁移工作的执行过程,包括了内建后台管理系统使用的数据迁移,代码如下:
$python manage.py migrate
Operations to perform:
#数据库迁移应用的模块:
admin:后台管理模块
auth:模块负责用户认证
contenttypes:数据模型处理
sessions:状态保持操作
Django后台管理系统已经内建了用户,权限,资源访问,和设置的数据模型和关联关系,可以通过命令行命令创建超级用户
>python manage.py createsuperuser
用户名 (leave blank to use 'think'): alin
电子邮件地址: 123@qq.com
Password:
Password (again):
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully
启动项目直接访问 http://127.0.0.1:8000/admin/可看到后台登录界面
如果想像我一样使用中文语言环境在settings设置中:
LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai'
输入创建好的账户和密码进入后台管理系统
在这里可以编辑个人信息增删改查用户
数据模型注册
在admin.py 添加以下代码
from django.contrib import admin
from .models import Classx
admin.site.register(Classx)
效果:
但是上述数据模型得注册,并不能对数据模型进行自定义规范格式得处理,所以我们需要自定义规范格式操作通过以下代码
class ClassxAdmin(admin.ModelAdmin)
admin.site.register(Classx,ClassxAdmin)
为了绑定好数据模型和数据管理类做了如下优化:
@admin.register(Classx)
class ClassxAdmin(admin.ModelAdmin)
pass
数据模型管理得指定属性
list_display(指定展示属性),可以在列表中处理定制的数据类型得字段
list_display = ("username”,'age',"email")
list_filter(条件过滤)出现了大量数据,方便清晰明了查看符合条件得数据
list_filter = ('gender','age')
list_per_page(分页显示条数限制)配置每页默认展示得数据条数
list_per_page = 5
ordering(排序规则限制)重新定义并覆盖原生得数据排列顺序
ordering = ['username','age']
fields(设置编辑字段)可以在列表页面中指定展示操作得字段数据默认会针对对象得所有数据进行编辑修改
-
效果
- 可以对引入数据表做增删该查功能
-
三.表单组件form的应用
- Django框架提供了django.forms.Form,封装表单实例
- 一.在项目中创建表单模块forms.py ,编辑联系我们得表单代码如下
from django import forms class Feedform(forms.Form): GENDER = (('0','男'),('1','女')) # fd = forms.CharField(label="编号/隐藏",widget=forms.HiddenInput) name = forms.CharField(label="姓名") name.widget.attrs.update({'class':'name'}) # sex = forms.ChoiceField(label='性别',choices = GENDER,widget=forms.RadioSelect) # birthday = forms.DateField(label="生日",widget=forms.SelectDateWidget) # head = forms.FileField(label="头像",widget=forms.FileInput) content = forms.CharField(label="内容",widget=forms.Textarea) phone = forms.CharField()
表单数据处理
#封装之后得表单数据处理‘在视图函数中
from .forms import Feedform
class myform(View): def get(self,request): form1 = Feedform() return render(request,'myform1.html',{'form1':form1}) def post(self,request): form1 = Feedform(request.POST) if form1.is_valid(): data = form1.cleaned_data Myform.objects.create(**data) else: return HttpResponse("不合法") return HttpResponse("感谢记录")
在网页视图中,通过表单对象得as_p 方式将表单元素渲染成p标签添加css样式
<h2> 基本表单渲染</h2>
{% load static %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>myform1</title> <link rel="stylesheet" href="{% static 'css/common.css' %}"> </head> <body> <form action="" method="post"> {% csrf_token %} {{ form1.as_p }} <input type="submit" value="提交"> </form> </body> </html>
配置路由
app_name = 'formdemo' from django.urls import path from formdemo import views urlpatterns = [ path('get/',views.myform.as_view(),name='get'),]
效果
四.表单组件Modelform的应用
ModelForm就是结合数据模型(Model),解决表单实例封装造成代码冗余得高级类表单
-
二、使用步骤
-
1.在model.py中定义用户处理类
代码如下(示例):
-
from django.db import models
class Myform2(models.Model): name = models.CharField(max_length=23,verbose_name="姓名") content = models.CharField(max_length=200,verbose_name="内容") phone = models.CharField(max_length=23,verbose_name="手机号")
-
代码如下(示例):
-
from formdemo.models import Myform2 class Feedform2(forms.ModelForm): class Meta: #定义关联模型 model = Myform2 #定义在表单显示得所有字段 fields = ['name','content','phone']
三.添加用户信息记录地视图函数
-
from django.shortcuts import render,HttpResponse from django.views import View from .myform import Feedform2 from .models import Myform2
class myform2(View): def get(self,request): form1 = Feedform2() return render(request,'myform1.html',{'form1':form1}) def post(self,request): form1 = Feedform2(request.POST) if form1.is_valid(): data = form1.cleaned_data Myform2.objects.create(**data) else: return render(request,'myform1.html',{'form1':form1}) return HttpResponse("感谢记录")
四.在网页视图中直接处理form实例,通过指定的函数渲染
-
<form action="" method="post"> {% csrf_token %} {{ form1.as_p }} <input type="submit" value="提交"> </form>
- 五.配置好子项目的路由映射关系后,启动项目并打开网页
五.登录注册
1.注册用户views.py
from django.contrib.auth.models import User def myregister(request): if request.method == 'GET': return render(request,'myregister.html') else: username = request.POST.get("username") email = request.POST.get("email") password = request.POST.get("password") User.objects.create_superuser(username=username,email=email,password=password) return HttpResponse("注册成功")
2.注册页面
<h2>注册页面</h2> <form action="" method="post"> {% csrf_token %} 用户名:<input type="text" name="username"><br> 邮箱:<input type="text" name="email"><br> 密码:<input type="text" name="password"><br> <input type="submit" value="注册" >
3.登录用户(注销和主页)
from django.contrib.auth import authenticate,login,logout from django.contrib.auth.decorators import login_required @login_required(login_url='/smanage/mylogin') def myindex(request): return render(request,'myindex.html') def mylogout(request): logout(request=request) return redirect('smanage:myindex') def mylogin(request): if request.method == 'GET': return render(request, 'mylogin.html') else: username = request.POST.get("username") password = request.POST.get("password") user = authenticate(request=request,username=username, password=password) if user is not None: login(request=request, user=user) #http协议是无状态的协议 # 一个机制 cookie-session 机制 # 第一次 cookie-session 机制 # 第一次 客户-->服务器的时候(服务器怎么知道我第一次来呢?客户端没带cookie) # 服务端产生一个随机的字符串(一个身份标识 在服务器被称为session),将其存在数据库中,另外也给到客户端 cookie # 看响应头中set-cookie # 第二次客户+身份标识cookie -->服务器 去数据库中查询 else: return redirect('smanage:myregister') return redirect('smanage:myindex')
4. myindex页面
<h4>"这是首页必须登录才能看见"</h4> 欢迎{{ request.user.username }},您已经登录成功 <----> <button><a href="{% url 'smanage:mylogout' %}">注销</a></button>
5. mylogin.html
<form action="" method="post"> {% csrf_token %} 欢迎 {{ request.user }}<br> 用户名:<input type="text" name="username" placeholder="请输入用户名"><br> 密码 :<input type="password" name="password" placeholder="请输入密码"><br> <input type="submit" value="登录" > </form>
6.效果
六.上传文件
一.配置models.py模块
class UserInfo(models.Model): name = models.CharField(max_length=200) img = models.ImageField(upload_to='static')生成迁移文件,到数据库
二.在项目中添加static表
三.配置view.py视图函数
from .models import UserInfo def userinfo_add(request): if request.method == 'GET': return render(request,'userinfo_add.html') else: name = request.POST.get('name') img = request.FILES.get('img') userinfo = UserInfo(name=name,img=img) userinfo.save() return HttpResponse("您的图片上传成功!") def userinfos(request): userinfos = UserInfo.objects.all() return render(request,'userinfos.html',{'userinfos':userinfos})
四配置userinfo_add.html
<form action="" method="post" enctype="multipart/form-data"> {% csrf_token %} 用户姓名:<input type="text" name="name"> <br> 图片:<input type="file" name="img"> <br> <input type="submit" value="提交图片"> <button><a href="{% url 'article:userinfos' %}">查看详情</a></button> </form>
看效果
.配置好子项目的路由映射关系后,启动项目并打开网页