首页
畅所欲言
友情链接
壁纸大全
数据统计
推荐
工具箱
在线白板
Search
1
职教云小助手重构更新,职教云助手最新版下载地址【已和谐】
14,232 阅读
2
职教云-智慧职教,网课观看分析(秒刷网课)
11,468 阅读
3
gradle-5.4.1-all.zip下载
9,509 阅读
4
职教云-智慧职教,签到补签分析(逆天改命系列)
8,203 阅读
5
一个优秀的程序员从写文档开始:免费领14个月语雀云笔记会员
7,019 阅读
学习笔记
Web
Python
转载文章
算法刷题
JS逆向
综合笔记
安卓
物联网
Java
C
资源收集
软件收藏
网络资源
影视专辑
TED英语角
随便写写
随手拍
登录
/
注册
Search
Lan
累计撰写
617
篇文章
累计收到
629
条评论
首页
栏目
学习笔记
Web
Python
转载文章
算法刷题
JS逆向
综合笔记
安卓
物联网
Java
C
资源收集
软件收藏
网络资源
影视专辑
TED英语角
随便写写
随手拍
页面
畅所欲言
友情链接
壁纸大全
数据统计
推荐
工具箱
在线白板
搜索到
617
篇与
的结果
2021-05-25
微信公众号msgSecCheck接口总是返回{
首先遇到报错{'errcode': 47001, 'errmsg': 'data format error rid: 60ac6d57-058e8ba0-3fa910cf'}经过百度,发现是因为请求的data不是json格式,遂将data进行json.dumps后发现每次返回{'errcode': 0, 'errmsg': 'ok'}输出后发现评论内容也是转义了。所以 成功解决res = requests.post(f'https://api.weixin.qq.com/wxa/msg_sec_check?access_token={access_token}', headers={'content-type': 'application/json'}, data=json.dumps({'content': content.encode("utf-8").decode("latin1")}, ensure_ascii=False)).json()
2021年05月25日
765 阅读
1 评论
0 点赞
2021-05-24
适合自己的才是最好的,我的第一块机械键盘“RK速写键盘”
早就有买键盘的想法了,只不过当时。。。这两天再次逛了逛,最一开始是想买巧克力键盘的,就是和自己笔记本电脑上面的一样,还有就是比较静音,不会打扰到别人,然后发现似乎这些看着有点low的感觉,所以放弃。然后看中了京东京造的K1,但是吧按键数量有点少了,和自己目前笔记本键盘键位差的还是有点远的,感觉会影响生产力。兜兜转转,在今天凌晨发现了一个rk速写键盘,96键,布局和我目前使用的基本一致,并且也是矮轴,主要是吧颜值在线,缺点就是白色不耐脏吧,其他的得等到了再具体体验。既然已经决定是他了,那么就和其他的说再见吧。虽然不是京东自营店,但是速度也挺快的,今天买,明天就能到,舒服,这也是我为啥用京东的主要原因。下一个目标,小主机,打印机键盘已经收到了,外观感觉不错,但是键位还是需要点时间适应产品参数 | 使用说明 | 保养须知 | 保修条例产品参数型号RK速写(929)键帽透光键帽尺寸342*124*22±2mm电压5v≤200mA轴体机械轴 青/红/茶/黑连接蓝牙、USB规格96全键无冲包装键盘、数据线、保修卡背光单色背光保修非人为损坏一年质保使用说明(温馨提示:双系统仅新版本键盘支持)●复合键功能说明win系统Mac系统win系统Mac系统Fn+F1我的电脑屏幕亮度+Fn+F7播放/暂停上一首Fn+F2浏览器屏幕亮度-Fn+F8停止播放/暂停Fn+F3邮箱窗口切换Fn+F9音量+下一首Fn+F4播放器多任务Fn+F10静音静音Fn+F5上一首键盘亮度-Fn+F11音量-音量-Fn+F6下一首键盘亮度+Fn+F12计算器音量+●所有功能键一览Fn+AWin系统Fn+删除键背光切换Fn+SMac系统Fn+ 数字键盘/侧边灯切换Fn+Tab蓝牙/有线模式切换Fn+退格键自定义背光录制Fn+B蓝牙配对Fn+Esc长按3秒出厂设置Fn+Win锁定/开启win键●灯光效果▍Fn+1 FPS 游戏模式--6键发光 (W/A/S/D/↑/↓/←/→ )▍Fn+2 LOL游戏模式--14键发光(1/2/3/4/5/6/Q/W/E/R/A/S/D/F )▍Fn+3 办公模式--26字母和标点符号发光▍Fn+backspace(删除键) 自定义背光录制 在以上任意三种发光模式下,按下Fn+backspace可开启自定义背光录制,点击对应按键即可点亮,再次按下熄灭;录制完成后,再次按下Fn+backspace保存退出。▍Fn+Delete 支持17种背光效果循环切换▍Fn+数字键盘/ 侧边灯光设置(支持3种效果循环切换)1.七色渐变:七种颜色自动循环变换;2.单色切换:支持七种单色灯光循环切换,按一下切换一种颜色;3.侧灯关闭。●背光亮度/速度设置▍Fn+↑ 背光亮度增加共五档调节,调节到最大峰值时,指示灯将连续闪烁三次,表明已到最大亮度▍Fn+↓ 背光亮度减小共五档调节,支持关闭背光,调节到最小峰值时,指示灯将连续闪烁三次,表明已到最小亮度(背光关闭)。▍Fn+← 动态变幻速度减小共五档调节,调节到最小峰值时,指示灯将连续闪烁三次,表明已到最小变幻速度▍Fn+→ 动态变幻速度增加共五档调节,调节到最达峰值时,指示灯将连续闪烁三次,表明已到最达变幻速度●蓝牙功能▍Fn+Tab 蓝牙/USB有线模式切换。切换时全键盘背光闪烁多次,即表示切换成功。▍Fn+B 长按3秒,进入蓝牙配对模式。配对时B键持续闪烁,配对成功后停止闪烁。▍Fn+Q/W/E 支持存储三组蓝牙设备。切换时全键盘背光闪烁多次,表示切换成功。↓↓↓↓你所关心的在这里↓↓↓↓●蓝牙连接方法1、打开键盘背部开关 (on为开启;off为关闭;若无反应请连接USB线进行充电。)2、确保键盘当前为蓝牙模式,(验证方法:Fn+Q全键背光闪烁多次则证明为蓝牙模式,反之若无反应,请通过Fn+Tab切换为蓝牙模式3、Fn+Q/W/E选择一组设备,比如Fn+Q,此时全键背光闪烁多次则表示选择成功4、Fn+B长按3秒,使键盘进入配对模式,此时B键持续闪烁。5、打开电脑/手机蓝牙,搜索并连接“RK bluetooth keyboard”的设备。6、连接成功,B键停止闪烁以此类推,通过Fn+Q/W/E可连接3个设备,并在这5个设备之间进行切换。温馨提示:如果使用蓝牙连接,请确保键盘为至蓝牙模式;如果使用USB连接,请确保键盘为USB有线模式。否则键盘将无法正常使用。●其他设置▍Fn+Esc 恢复出厂设置(长按3秒,全键盘背光闪烁多次,此时已完成出厂设置)。▍Fn+Win 锁定/解锁 windows键功能●关于充电1、电量过低时,Fn键背光快速闪烁,此时请充电。2、充电时,Fn键背光缓慢闪烁。3、充满后,Fn键背光停止闪烁。4、若1分钟无操作,键盘背光自动关闭并进入睡眠状态(节省电量)。 此时按任意键即可唤醒并继续使用。保养须知 机械键盘从结构上来说也仅仅是每颗按键下面一颗开关而已, 从结构本身上惧怕灰尘、饮料、油水类的物质, 日常的使用中需注意因为这些物质掉落到键盘内部引致按键失灵或者电路板损坏。1、灰尘类注意事项:避免烟灰等大量灰尘落入键盘内部的情况发生如果有烟灰或者其他灰尘落入,最好的处理方式是拔掉键帽,使用吸尘器以及毛刷,边刷边吸,处理干)争即可。千万不要在没有拔掉键帽的情况下翻转键盘拍打,这样会造成更多的灰尘进入到轴体内部造成轴体损坏。2、键盘清洁泥使用方法:杜绝把整块清清泥直接用力按压到键盘上正确的使用方法为用轻微的力度,清理键帽表面灰尘,然后拔掉键帽,取一小:t央清洁泥揉成小球,在轴体的空隙处的滚动,把灰尘粘干浄即可。3、键盘进液的注意事项:任何种类的流体落入键盘内部,请快速为键盘断电。同时使用电吹风和大号纸箱手工制作烘干箱,将键盘整体放入进行2小时左右的快速烘干(避免电吹风口近距离直接吹到键盘,否则键盘外売会因为高温引起变形)如遇清水之外的流体侵入,烘干以后轴体出现问题的,请尽快联系售后进行处理。 一把好的键盘,在为您提供出色的输入体验和乐趣的同时,也需要您的悉心爱护,远离烟灰、液体才能保证键盘的正常使用。正确的处置方式,可以让您的键盘出现意外情况的时候,得到最大程度的保护,避免键盘收到不可逆的损坏。RK机械式键盘保修条例 产品自购买之日起12个月内出现产品本身的质量问题.请按如下方式获得售后服务: 1、购买产品7天内出现质量问题,请携带产品、购买收据以及全部发件和包装(完好无损) ,前往购买处申请全额退款;2、购买产品15天内出现质量间题,请携带产品、购买收据以及全部发件和包装(完好无损) ,前往购买处申请更换新品;3、购买产品15天后出现质量问题,请携带产品、购买收据以及产品包装,前往购买处申请维修;4、个人原因造成的产品损坏,维修时须收取一定金额的费用。拒保范围1、外观损伤、无Logo或超出服务期限的产品;2、被拆卸、撞伤、私自升级、修理、改装或零件缺失的产品; 3、电路烧毁或数据、电源接口损伤的产品;4、有异味、 异象或产品夹缝内有异物的产品。
2021年05月24日
817 阅读
0 评论
0 点赞
2021-05-23
Lan的微信公众号正式开通啦“星歌”,欢迎关注
昨天5月22日,一时兴起,注册了一个微信公众号“星歌”,这个名字也没什么太大含义吧,不过起名字的时候也是纠结了好一会,在网上搜了半天,然后发现这个还没有被使用,于是便注册了。欢迎各位关注捧场,后续将会开放更多好玩的功能在这个微信公众号上面。因为之前一直在开发一个公众号号的后端,因此自己也想整一个玩一下,顺便开发一些好玩的功能。
2021年05月23日
423 阅读
0 评论
0 点赞
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日
439 阅读
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日
477 阅读
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日
578 阅读
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日
484 阅读
0 评论
0 点赞
1
...
32
33
34
...
89