96SEO 2026-02-20 04:51 19
个问题我们是将所有的请求都直接处理了并没有去检查是否为已经登录的管理员发送的如果是这样的话客户端可以不选择登录直接去访问主页文件那么登录就毫无意义了。

所以我们要在处理前端请求前先去判断这个请求的合法性通常的两种方案就是session
表示会话的意思Django在服务端在数据库中保存一张session表
这个表中记录了用户登录的信息具体的信息各个系统都略有不同大致都会有id、姓名、登录名称之类的在下图中我们可以看到存储着session_key(会话ID)
每当用户成功登录之后服务端都会往数据库表session中记录一条数据也就是创建一个新的会话id写入数据表同时也
requests.post(http://127.0.0.1:8000/api/mgr/signin,datapayload)pprint.pprint(response.json())#输出相应头
response.headers.items():print(f{header}:
sessionidotfwixmjgfngfc45n8k6efobiff4f3xs;
sessionidotfwixmjgfngfc45n8k6efobiff4f3xs;
sessionid6qu1cuk8cxvtf4w9rjxeppexh2izy0hh
都会在请求头的Cookie字段添加上面说的sessionID服务端接受到请求后只需要到session表中查看是否有该sessionID对应的记录这样就可以判断这个请求前面是已经登录过如果不是就可以拒绝服务重定向http请求到登录页面让用户登录
在一开始的登录函数中我们调用了一个函数request.session[usertype]
sessionidotfwixmjgfngfc45n8k6efobiff4f3xs;
需要验证请求的cookie里面是否有sessionid并且检查session表看看是否存在session_key为该sessionid
数据我们可以把前面数据库增删改查视为我们的主页只需要从主页函数调用之前去做下检查即可
http://127.0.0.1:8000/api/mgr/customers/?actionlist_customer
可以看到尝试直接访问后端信息时因为找不到登录时携带的会话id则不运行登录
我们修改一下请求方法先发送登录请求然后将相应头中的Set-Cookie取出在发起访问时在请求头中携带获取到的Cookie去请求就能正常访问了
requests.post(http://127.0.0.1:8000/api/mgr/signin,datapayload)#拿到请求请求响应头中的值
response.headers.get(Set-Cookie)
requests.get(http://127.0.0.1:8000/api/mgr/customers/?actionlist_customer,headersheaders)pprint.pprint(response.json())
到数据库中查找session表的#而数据库操作是服务端常见的性能瓶颈尤其是当用户量比较大的时候2、扩展性问题
#当系统用户特别多的时候后端处理请求的服务端通常是部署在多个节点上#但是多个节点都要访问session表这样就要求数据库服务能够被多个节点访问#不方便切分数据库以提高性能。
客户端客户每次请求再携带过来给服务端。
服务端无需查找数据库直接根据token里面的数据信息进行校验
但是上面的方法存在一个问题假设我是普通用户那天我获取到了一个vip用户的token拿是不是我就能访问vip用户的权限了为了防止
key)2、用户登录成功后,服务端会将用户的信息数据和密钥一起进行一个哈希计算从而得到一个哈希值首先为了哈希算法保证一致性只能根据同样的数据源获取如果有人修改了用户信息成其他人的除非他也拿到了密钥,
所以这个哈希值就方便我们用来做数据校验当我们拿到了这个独一无二的哈希值后将哈希值和用户数据再做成一个字符串这个字符串也就被称之为tokentoken里面包含了用户数据和数据校验的哈希值服务端接受到请求后返回token值通常来说token是放在http响应头部中的,
api请求则会在请求消息中带上token值服务端接收到请求后会根据数据信息和密钥使用哈希再次生成哈希值如果用户修改了数据因为不知道密钥没有办法得到正确的新的哈希值那么服务端根据篡改后的数据和密钥得到的新的哈希值一定不同就知道数据被修改了如果客户端没有修改数据服务端根据原来的数据加上密钥得到的哈希值与保存在otken中的哈希值一对比校验通过后就知道没有被修改可以放心使用token中的用户数据了
Django_demo/Django_demo/settings.py
[simpleui,django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib.sessions,django.contrib.messages,django.contrib.staticfiles,paas,mgr,#添加下面的配置rest_framework,rest_framework.authtoken,rest_framework_simplejwt.token_blacklist,
Django_demo/Django_demo/settings.py
#找个空地方直接贴上,其中包含了认证方式和Token的过期时间等
{DEFAULT_AUTHENTICATION_CLASSES:
[rest_framework.au***ntication.TokenAu***ntication,
使用Token进行身份验证],DEFAULT_PERMISSION_CLASSES:
[rest_framework.permissions.IsAu***nticated,
需要进行身份验证的默认权限类],DEFAULT_THROTTLE_RATES:
匿名用户每天最多可以进行10次请求},DEFAULT_RENDERER_CLASSES:
[rest_framework.renderers.JSONRenderer,
默认使用JSON渲染器来渲染响应],DEFAULT_PARSER_CLASSES:
[rest_framework.parsers.JSONParser,
默认使用JSON解析器来解析请求数据],DEFAULT_METADATA_CLASS:rest_framework.metadata.SimpleMetadata,
默认使用简单元数据类DEFAULT_VERSIONING_CLASS:rest_framework.versioning.URLPathVersioning,
使用URL路径版本控制DEFAULT_FILTER_BACKENDS:
[django_filters.rest_framework.DjangoFilterBackend
Filter后端来进行过滤],DEFAULT_PAGINATION_CLASS:rest_framework.pagination.PageNumberPagination,
默认的分页类为PageNumberPaginationPAGE_SIZE:
默认的每页返回的对象数量为10DEFAULT_THROTTLE_CLASSES:
[rest_framework.throttling.AnonRateThrottle,
默认使用匿名速率限制类rest_framework.throttling.UserRateThrottle
默认使用用户速率限制类],DEFAULT_SCHEMA_CLASS:
rest_framework.schemas.coreapi.AutoSchema,
默认使用AutoSchema来生成API文档DEFAULT_CONTENT_NEGOTIATION_CLASS:
rest_framework.negotiation.DefaultContentNegotiation,
默认使用DefaultContentNegotiation进行内容协商COERCE_DECIMAL_TO_STRING:
默认的日期时间格式DATETIME_INPUT_FORMATS:
%H:%M,%Y-%m-%d,%Y%m%dT%H%M%S%fz],
}我们设置了TokenAu***ntication作为默认的认证方式同时设置了IsAu***nticated权限表示只有已认证用户才能访问
http://127.0.0.1:8000/api/mgr/customers/?actionlist_customer
导入TokenAu***ntication类用于基于令牌进行身份验证
导入IsAu***nticated类用于检查用户是否已通过身份验证的权限
导入装饰器函数用于设置视图函数的身份验证和权限控制#添加装饰器
au***ntication_classes([TokenAu***ntication])
permission_classes([IsAu***nticated])
...http://127.0.0.1:8000/api/mgr/customers/?actionlist_customer
我们需要让应用登录成功后获取到一个token值这里的token我们通过直接取用户
rest_framework.authtoken.models
Token.objects.get_or_create(useruser)
在登录函数登录成功之后添加一个获取登录用户token的值并跟随相应头返回token
request.POST.get(username)passWord
user.is_superuser:login(request,
rest_framework.authtoken.models
User.objects.get(usernameuserName)#
Token.objects.get_or_create(useruser)return
requests.post(http://127.0.0.1:8000/api/mgr/signin,datapayload)
print(response.headers.get(Authorization))
1568e26d12af8a5a6489603763e662cf0c65c73a
requests.post(http://127.0.0.1:8000/api/mgr/signin,datapayload)
response.headers.get(Authorization)#携带token请求
requests.get(http://127.0.0.1:8000/api/mgr/customers/?actionlist_customer,headersheaders)pprint.pprint(response.json())
Framework中是使用默认的Au***ntication模块提供的它默认存储在数据库中并且没有过期时间。
这意味着一旦生成并分配给用户Token将一直有效直到被明确删除。
存储Token的数据库表是authtoken_token在数据库中的位置取决于你的Django项目的数据库配置。
默认情况下Token会与用户相关联并且将存储在Token模型的user字段中。
每个用户可以有多个Token因此可以在这个模型上执行标准的查询操作
如果你希望对Token设置过期时间或者有更高级的需求你可以考虑使用第三方库如django-rest-framework-simplejwt。
这个库提供了JWTJSON
Token认证可以根据特定的配置设置Token的过期时间和其他功能。
TokenToken通常存储在服务器端的数据库中或者可以存储在客户端的cookie或本地存储中。
每次发起请求时Token将通过请求头或请求参数进行传递。
SessionSession通常存储在服务器端的数据库或缓存中。
服务器将为每个会话分配一个唯一的Session
ID存储在客户端的cookie中。
客户端在发送请求时会自动携带Session
Token是无状态的服务器不需要在后端存储任何关于用户会话的状态信息。
每个请求都包含所有必要的信息通常是在Token本身中来进行身份验证和授权。
SessionSession是有状态的服务器需要在后端存储有关用户会话的状态信息。
客户端的每个请求都需要携带Session
由于Token是无状态的因此易于扩展和支持跨域请求。
服务器不需要存储每个用户的会话状态因此可以更好地支持负载均衡和分布式系统。
Session
由于Session是有状态的需要在服务器端存储状态信息因此在处理大量并发请求或跨域请求时可能存在一些挑战。
Token可以通过设置过期时间来自动失效或者可以通过撤销Token的方式来手动使其失效。
客户端需要负责在失效前获取新的Token。
Session
Session可以通过设置过期时间来自动失效但服务器也可以更主动地管理会话状态例如在用户注销或一段时间内无活动后自动销毁会话。
Token适用于无状态、扩展性要求高、移动应用程序的场景而Session适用于有状态、需要跟踪用户会话状态的场景
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback