首页
畅所欲言
友情链接
壁纸大全
数据统计
推荐
工具箱
在线白板
Search
1
职教云小助手重构更新,职教云助手最新版下载地址【已和谐】
14,028 阅读
2
职教云-智慧职教,网课观看分析(秒刷网课)
11,351 阅读
3
gradle-5.4.1-all.zip下载
9,340 阅读
4
职教云-智慧职教,签到补签分析(逆天改命系列)
8,136 阅读
5
一个优秀的程序员从写文档开始:免费领14个月语雀云笔记会员
6,989 阅读
学习笔记
Web
Python
转载文章
算法刷题
JS逆向
综合笔记
安卓
物联网
Java
C
资源收集
软件收藏
网络资源
影视专辑
TED英语角
随便写写
随手拍
登录
/
注册
Search
Lan
累计撰写
615
篇文章
累计收到
629
条评论
首页
栏目
学习笔记
Web
Python
转载文章
算法刷题
JS逆向
综合笔记
安卓
物联网
Java
C
资源收集
软件收藏
网络资源
影视专辑
TED英语角
随便写写
随手拍
页面
畅所欲言
友情链接
壁纸大全
数据统计
推荐
工具箱
在线白板
搜索到
450
篇与
的结果
2021-05-22
django使用jwt进行身份验证
前言使用django-rest-framework开发api并使用json web token进行身份验证在这里使用django-rest-framework-jwt这个库来帮助我们简单的使用jwt进行身份验证并解决一些前后端分离而产生的跨域问题安装django-rest-framework在终端输入以下命令安装pip install djangorestframework pip install djangorestframework-jwt在settings.py的INSTALLED_APPS中加入:INSTALLED_APPS = [ ... 'rest_framework', 'rest_framework.authtoken', # 设置token ... ]安装django-cors-headers解决api跨域请求有好几种方法,比如(jsonp,在apache或nginx中设置,在请求头里设置),我们这里使用这个包来方便的跨域pip install django-cors-headers配置settings.py文件INSTALLED_APPS = [ ... 'corsheaders', ... ] MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', ... ]后端配置设置过期时间还有很多配置需要自己看文档import datetime JWT_AUTH = { 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7), 'JWT_AUTH_HEADER_PREFIX': 'JWT',}修改使用jwt验证的URLfrom rest_framework_jwt.views import obtain_jwt_token url(r'^login/', obtain_jwt_token),测试1.Postman里携带用户名密码登陆可以看到jwt为我们返回的token2.Views里设置token验证购物车需要token认证才能查看class ShoppingCartViewset(viewsets.ModelViewSet): """ 购物车功能 list: 获取购物车详情 create: 加入购物车 delete: 删除购物记录 """ permission_classes = (IsAuthenticated, IsOwnerOrReadOnly) # 标记需要进行jwt验证 authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication) serializer_class = ShopCartSerializer lookup_field = "goods_id"3.使用Postman携带token访问购物车作者:人生苦短啊链接:https://www.jianshu.com/p/740a0320f960来源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2021年05月22日
428 阅读
0 评论
0 点赞
2021-05-22
使用Django实现微信公众号用户openid登录认证
最近在用Django做一个小项目,需要将微信的用户与网站的用户进行关联,由于是微信的订阅号,没有oauth网页授权的权限,只能退而求其次,在响应中获取用户的openid,来唯一的标识用户。Django中用户的模型继承和扩展于AbstractUser,在用户模型中添加openid字段(models.py):class Users(AbstractUser): openid = models.CharField(max_length=100,blank=True,null=True,verbose_name="openid",unique=True)我们扩展了用户的模型,并使用这个模型来作为用户认证的模型,需要在setting.py文件里指定认证的模型(website是django应用的名称,非项目名称):AUTH_USER_MODEL = 'website.Users'这样,我们就能够使用上面定义的Users模型来进行用户的登录和注册操作了。一个常见默认的Django登录认证,使用的是authenticate,在此引用Django文档中的叙述:认证一个给定用户名和密码,请使用authenticate()它以关键字参数形式接收凭证,对于默认的配置它是username和password,如果密码对于给定的用户名有效它将返回一个User对象。如果密码无效,authenticate()返回None。例子:from django.contrib.auth import authenticate user = authenticate(username='john', password='secret') if user is not None: if user.is_active: print("User is valid, active and authenticated") else: print("The password is valid, but the account has been disabled!") else: print("The username and password were incorrect.")如果authenticate返回正确的User对象,我们再使用login()方法,对返回的User对象进行登录:from django.contrib.auth import login login(request,user)这样就完成了一个最基本的Django用户认证。如果我们要用其他的方式进行登录认证呢,比如电子邮箱、手机号、或是本文所说的重点:微信openid,那就需要自定义认证方式。在Django中进行自定义认证很是方便,完成一个自定义的认证只需要三步: 1、编写一个认证后端:一个认证后端是个实现两个方法的类: get_user(user_id)和authenticate(**credentials)在此,我们新建一个py文件wechatAuth.py来写openid的认证后端:from .models import Users''' 微信openid认证登录 '''class WechatOpenidAuth(object): def get_user(self,id_): try: return Users.objects.get(pk=id_) except Users.DoesNotExist: return None def authenticate(self,openid=None): try: user = Users.objects.get(openid=openid) if user is not None: return user else: return None except Users.DoesNotExist: return None 2、在配置文件setting.py中指定认证后端:在底层,Django 维护一个“认证后台”的列表。当调用django.contrib.auth.authenticate() 时,Django 会尝试所有的认证后台进行认证。如果第一个认证方法失败,Django 将尝试第二个,以此类推,直至试完所有的认证后台。使用的认证后台通过AUTHENTICATION_BACKENDS 设置指定。AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend', 'website.wechat_auth.WechatOpenidAuth',)第一个认证后端是Django默认的认证方式,因为在Web端还需要使用,所以保留,第二个就是基于openid的认证后端。 3、使用自定义的认证后端处理登录授权:同样的使用authenticate()方法和login()方法,但是我们只传入一个参数进去,就是openidfrom django.contrib.auth import login,authenticatedef auth(request,openid): try: auth =authenticate(openid=openid) login(request,auth) print("登录成功",auth) except Exception as e: print(e)这样,一个基于openid的认证就完成了。在微信的订阅号中,我们可以利用click事件返回一个文本消息或图文消息,在其链接之中带上openid的参数。这样,当用户点击链接,就可以静默地完成用户的登录了。
2021年05月22日
469 阅读
0 评论
1 点赞
2021-05-14
论Ajax请求拦截表单时为何不能return值,异步和同步
现在验证表单经常会用到Ajax验证,去查看用户名是否存在或者手机号是否存在啥的,为了方便,就可以使用Ajax进行验证了。第一次遇到这个问题是上课时用.Net MVC然后里面有一个要求是验证用户名是否存在,一开始我也是半天请求之后不能进行表单拦截。随便写了一个样例如下: public ActionResult Index() { return View(); } public bool veruser(string username) { return true ? username.Equals("Lan") : false; }@{ ViewBag.Title = "Home Page"; } <div class="row"> <form class="bs-example bs-example-form" action="/" method="post"> <div class="form-group"> <label for="name">用户名</label> <input type="text" class="form-control" id="username" placeholder="请输入用户名"> </div> <button type="submit" onclick="return checkUser()" class="btn btn-default">提交</button> </form> </div> @section scripts{ <script> function checkUser() { $.ajax({ url: "/Home/veruser", method: "POST", data: { "username": $("#username").val() }, success: function (res) { console.log("请求返回值:" + res) return true ? res === "True" : false } }) } </script> }大概是这样的,如果请求的用户名中包含Lan则返回true否则返回false实际页面效果展示:可以看到控制台,一次输出FALSE一次输出True,但是两次页面都跳转了,所以拦截没有成功。然后我以为是ajax里面不能返回值,然后进行了修改,在外面指定了一个result变量,进行赋值,然后再return这个result<script> function checkUser() { var result = false; $.ajax({ url: "/Home/veruser", method: "POST", data: { "username": $("#username").val() }, success: function (res) { console.log("请求返回值:" + res) result = true ? res === "True" : false } }) console.log(result) return result } </script>然后发现赋值没有附上,然后我以为是变量的作用域问题,于是又指定了一个that去指定方法中的this,于是这样赋值直接为空然后偶尔几次,还能重新赋值,这时候考虑到是不是线程问题。后来百度发现Ajax默认是开启异步的,恍然大悟。于是将async关闭后。 <script> function checkUser() { $.ajax({ url: "/Home/veruser", method: "POST", async: false, data: { "username": $("#username").val() }, success: function (res) { result = true ? res === "True" : false } }) console.log(result) return result } </script>成功解决。其实一开始我用的教室电脑,反应可能没那么快,所以能够赋值到result上,我刚刚重现的时候用的自己电脑,速度可能快一些,所以来不及赋值就走了。之前我以为是作用域问题,然后看似好像解决了,但是其实是错误的,昨天我用Python写验证拦截的时候,发现也是直接跳转了,试了一节课,总算发现了Ajax异步的问题。
2021年05月14日
568 阅读
1 评论
1 点赞
2021-04-26
课表HTML有课的随机背景颜色
td { border-radius: 5%; }<font color="#ffffff"> <table border="0" width="100%" align="center" style="font-size: 0.5rem" bgcolor="#fec7ff" height="700"> <tr align="middle" style="font-weight: bold"> <td width="30"></td> <td width="50" align="center" height="30">周一</td> <td width="50" align="center" height="30">周二</td> <td width="50" align="center" height="30">周三</td> <td width="50" align="center" height="30">周四</td> <td width="50" align="center" height="30">周五</td> <td width="50" align="center" height="30">周六</td> <td width="50" align="center" height="30">周日</td> </tr> <tr align="middle"> <td style="font-weight: bold">1</td> <td bgcolor="#73b3f0" rowspan="2">{{ course.0.0|safe }}</td> <td rowspan="2">{{ course.1.0|safe }}</td> <td rowspan="2">{{ course.2.0|safe }}</td> <td rowspan="2">{{ course.3.0|safe }}</td> <td rowspan="2">{{ course.4.0|safe }}</td> <td rowspan="2">{{ course.5.0|safe }}</td> <td rowspan="2">{{ course.6.0|safe }}</td> </tr> <tr align="middle"> <td style="font-weight: bold">2</td> </tr> <tr align="middle"> <td style="font-weight: bold">3</td> <td rowspan="2" align="middle">{{ course.0.1|safe }}</td> <td rowspan="2">{{ course.1.1|safe }}</td> <td rowspan="2">{{ course.2.1|safe }}</td> <td rowspan="2">{{ course.3.1|safe }}</td> <td rowspan="2">{{ course.4.1|safe }}</td> <td rowspan="2">{{ course.5.1|safe }}</td> <td rowspan="2">{{ course.6.1|safe }}</td> <td rowspan="2">{{ course.7.1|safe }}</td> </tr> <tr align="middle"> <td style="font-weight: bold">4</td> </tr> <tr align="middle"> <td style="font-weight: bold">5</td> <td rowspan="2">{{ course.0.2|safe }}</td> <td rowspan="2">{{ course.1.2|safe }}</td> <td rowspan="2">{{ course.2.2|safe }}</td> <td rowspan="2">{{ course.3.2|safe }}</td> <td rowspan="2">{{ course.4.2|safe }}</td> <td rowspan="2">{{ course.5.2|safe }}</td> <td rowspan="2">{{ course.6.2|safe }}</td> </tr> <tr align="middle"> <td style="font-weight: bold">6</td> </tr> <tr align="middle"> <td style="font-weight: bold">7</td> <td rowspan="2">{{ course.0.3|safe }}</td> <td rowspan="2">{{ course.1.3|safe }}</td> <td rowspan="2">{{ course.2.3|safe }}</td> <td rowspan="2">{{ course.3.3|safe }}</td> <td rowspan="2">{{ course.4.3|safe }}</td> <td rowspan="2">{{ course.5.3|safe }}</td> <td rowspan="2">{{ course.6.3|safe }}</td> </tr> <tr align="middle"> <td style="font-weight: bold">8</td> </tr> <tr align="middle"> <td style="font-weight: bold">9</td> <td rowspan="2">{{ course.0.4|safe }}</td> <td rowspan="2">{{ course.1.4|safe }}</td> <td rowspan="2">{{ course.2.4|safe }}</td> <td rowspan="2">{{ course.3.4|safe }}</td> <td rowspan="2">{{ course.4.4|safe }}</td> <td rowspan="2">{{ course.5.4|safe }}</td> <td rowspan="2">{{ course.6.4|safe }}</td> </tr> <tr align="middle"> <td style="font-weight: bold">10</td> </tr> </table> </font><script src="https://cdn.jsdelivr.net/npm/jquery/dist/jquery.min.js"></script> <script> var chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']; function generateMixed(n) { var res = ""; for (var i = 0; i < n; i++) { var id = Math.ceil(Math.random() * 16); res += chars[id]; } return res; } $('td').each(function () { if ($(this).text().length > 2 && $(this).text() !== ' ') { $(this).css('background', '#' + Math.random().toString(16).substr(2, 6).toUpperCase()) } }) </script>
2021年04月26日
472 阅读
0 评论
0 点赞
2021-04-24
强智教务系统登陆JS逆向
去年这个时候,好像就研究过我们学校的教务系统登陆,当初不知道啥原因弄了一下就放弃了今天又试了一下,发现挺容易的,然后用Python实现了一下。登陆成功后,获取课表
2021年04月24日
1,009 阅读
0 评论
0 点赞
2021-04-08
让你的博客在QQ中以XML形式显示
效果图:1、复制下面链接,把后面域名更为成自己的 (红色区域,注意域名前面HTTPS),复制到浏览器打开 。 https://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshareget_urlinfo?url=https://gitlab.com/Vastsa/lanpicbed/-/raw/master/ 2、必须要用电脑打开链接,然后刷新页面,(F5),刷出一堆 json数据,这时候就可以了。自定义内容,修改页面的meta标签<meta itemprop="name" content="网站标题"/> <meta itemprop="image" content="网站要显示的图片链接" /> <meta name="description" itemprop="description" content="网站内容" />
2021年04月08日
642 阅读
1 评论
0 点赞
2021-04-06
deterministic=True requires SQLite 3.8.3 or higher
大概意思就是sqlite版本低了,我本地测试是没有问题的,部署到服务器之后就会这样的报错,以前都是用MySQL所以不会出现这个问题sqlite方便一些,之前也遇到过,解决了一次,办法很麻烦,需要更新本地的sqllite版本,以及更新软连接之类的,或者降低Django版本,都太麻烦了。今天在网上找到了另一个解决办法:更换sqlite3 为 pysqlite3新装模块pysqlite3pip install pysqlite3然后将报错的文件修改一下/Team/Team_venv/lib/python3.8/site-packages/django/db/backends/sqlite3/base.pyfrom pysqlite3 import dbapi2 as Database # 将默认数据库获取位置改为 pysqlite3修改之后解决
2021年04月06日
1,217 阅读
0 评论
0 点赞
1
...
22
23
24
...
65