无趣

享受自由


  • Home

  • About

  • Tags

  • Archives

Nginx Reverse Proxy Dynamic PDF URL and Online Preview

Posted on 2018-08-21 |
Symbols count in article: 308 | Reading time ≈ 0:01
location ~ /wlwxb/(?<aid>[0-9]+)/paper.pdf {
resolver 114.114.114.114;
proxy_pass http://www.wlwxb.cn/CN/article/downloadArticleFile.do?attachType=PDF&id=$aid;
proxy_hide_header Content-Type;
proxy_hide_header Content-Disposition;
add_header Content-Type application/pdf;
}

Django Aliyun OSS Plugin Example

Posted on 2018-08-15 |
Symbols count in article: 1.3k | Reading time ≈ 0:01
# project.storage.py
import oss2

from django.conf import settings
from django.core.files.storage import Storage


class AliyunObjectStorage(Storage):
def __init__(self):
self.access_key_id = settings.ALIYUN_OSS_KEY_ID
self.access_key_secret = settings.ALIYUN_OSS_KEY_SECRET
self.bucket_name = settings.ALIYUN_OSS_BUCKET_NAME
self.endpoint = settings.ALIYUN_OSS_ENDPOINT
self.access_url = settings.ALIYUN_OSS_ACCESS_URL

@property
def bucket(self):
return oss2.Bucket(oss2.Auth(self.access_key_id, self.access_key_secret), self.endpoint, self.bucket_name)

def _open(self, name):
return self.bucket.get_object(name)

def _save(self, name, content):
self.bucket.put_object(name, content)
return name

def delete(self, name):
return self.bucket.delete_object(name)

def exists(self, name):
return self.bucket.object_exists(name)

def listdir(self, path):
dirs, files = [], []
objects = self.bucket.list_objects(path).object_list
for object in objects:
files.append(object.key.split(path)[-1])
return dirs, files

def size(self, name):
return self.bucket.get_object_meta(name).content_length

def url(self, name):
return '{}/{}'.format(self.access_url, name)

极验 Django Example

Posted on 2018-08-11 |
Symbols count in article: 4k | Reading time ≈ 0:04
from user import views
from django.urls import path

app_name = 'user'

urlpatterns = [
path('register/', views.RegisterView.as_view(), name='register'),
path('login/', views.LoginView.as_view(), name='login'),
path('logout/', views.LogoutView.as_view(), name='logout'),
path('pc-gt/', views.GtValidateView.as_view(), name='gt-validate'),
path(r'active/<uidb64>/<token>/', views.ActiveView.as_view(), name='active'),
]
from django.conf import settings
from django.shortcuts import render
from django.contrib import messages
from django.http import HttpResponse
from django.urls import reverse_lazy
from django.contrib.auth.models import User
from django.contrib.auth import login, logout
from django.utils.http import urlsafe_base64_decode
from django.contrib.auth.tokens import default_token_generator
from django.http import HttpResponseRedirect, HttpResponseBadRequest
from django.views.generic import FormView, View, TemplateView, CreateView

from geetest import GeetestLib # https://github.com/GeeTeam/gt-python-sdk
from user.forms import UserRegisterForm, UserLoginForm


class GeeTestMixin(object):
gid = settings.GEETEST_ID # 极验ID
gkey = settings.GEETEST_KEY # 极验 Key

def check_request(self, request): # 检查验证是否通过
gt = GeetestLib(self.gid, self.gkey)
challenge = request.POST.get(gt.FN_CHALLENGE, '')
validate = request.POST.get(gt.FN_VALIDATE, '')
seccode = request.POST.get(gt.FN_SECCODE, '')
status = request.session[gt.GT_STATUS_SESSION_KEY]
user_id = request.session["user_id"]
if status:
return gt.success_validate(challenge, validate, seccode, user_id)
return gt.failback_validate(challenge, validate, seccode)


class RegisterView(CreateView, GeeTestMixin):
template_name = 'login_and_register.html'
form_class = UserRegisterForm
success_url = reverse_lazy('user:login')

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context.update({
'form_title': '注册'
})
return context

def form_valid(self, form):
super().form_valid(form)
messages.add_message(self.request, messages.INFO, '激活邮件已发出,请检查您的邮箱')
return HttpResponseRedirect(self.get_success_url())

def post(self, request, *args, **kwargs):
if not self.check_request(request):
messages.add_message(request, messages.ERROR, '验证失败')
return HttpResponseRedirect(reverse_lazy('user:register'))
return super().post(request, *args, **kwargs)


class GtValidateView(View, GeeTestMixin):

def get(self, request):
user_id = 'test'
gt = GeetestLib(self.gid, self.gkey)
status = gt.pre_process(user_id)
request.session[gt.GT_STATUS_SESSION_KEY] = status
request.session["user_id"] = user_id
response_str = gt.get_response_str()
return HttpResponse(response_str)
$.ajax({
url: "{% url 'user:gt-validate' %}",
type: "get",
dataType: "json",
success: function (data) {
//请检测data的数据结构, 保证data.gt, data.challenge, data.success有值
initGeetest({
// 以下配置参数来自服务端 SDK
gt: data.gt,
challenge: data.challenge,
offline: !data.success,
new_captcha: true,
}, function (captchaObj) {
captchaObj.appendTo('#captchaBox')

captchaObj.onReady(function () {
}).onSuccess(function () {
$('button[type=submit]').removeAttr('disabled')
}).onError(function () {
})
}
)
}
})

openvpn 中转 EasyConnect

Posted on 2018-04-12 |
Symbols count in article: 603 | Reading time ≈ 0:01

国内大部分高校都使用 easyconnect 这种傻逼的软件作为 vpn 解决方案,最近需要频繁登入某高校 VPN(easyconnect),由于手上只有一个账号,所以遇到了以下几个问题

  • 同一账号最多只能在一个客户端登录(多人使用会被挤下线)
  • 除了 Mac 和 Windows,Linux 下基本没法用
  • 连接过程过于繁琐

同事给我提了一个方案,通过一台主机中转 EasyConnect 连接,来解决上面的这些问题

大致拓扑图如下

VPN Architecture

Read more »

数据结构 - 栈

Posted on 2017-11-28 |
Symbols count in article: 952 | Reading time ≈ 0:01

栈是一种 LIFO(Last In First Out) 的数据结构,栈插入和删除都在 栈顶 操作

Read more »

刺客信条·起源 玩后感

Posted on 2017-11-22 |
Symbols count in article: 664 | Reading time ≈ 0:01

这几天把起源玩了一遍,虽然没有刷满全部成就,但是也前前后后玩了 30 多个小时,浅谈一下我对起源的看法。

Read more »

Container Overview

Posted on 2017-10-27 |
Symbols count in article: 2.9k | Reading time ≈ 0:03

总结了一些容器的知识,回答别人的问题

Read more »

Hbase Thrift API Test

Posted on 2017-10-20 |
Symbols count in article: 1.7k | Reading time ≈ 0:02

Install Thrift

$ yum groupinstall 'Development Tools' # install package group on centos

$ git clone https://github.com/apache/thrift.git

$ cd thrift

$ ./configure --with-lua=no

$ make && make install
Read more »

Python File Buffer

Posted on 2017-10-13 |
Symbols count in article: 2.3k | Reading time ≈ 0:02

Python 内置的 open 函数有一个 buffering 参数,用来设置打开文件的缓冲策略(buffer policy)

Read more »

Ansible 源码解析 - ansible 命令的调用

Posted on 2017-06-16 |
Symbols count in article: 8.3k | Reading time ≈ 0:08

这一系列文章将通过一些常见的 Ansible 使用例子来解析 Ansible 内部代码实现

Ansible 有很多命令,ansible、ansible-playbook、ansible-doc、ansible-galaxy、ansible-console 等,笔者在看 Ansible 入口代码的时候发现 Ansible 对于不同命令的处理方式很特别

Read more »
12345
AnyISalIn

AnyISalIn

Life is short

45 posts
39 tags
RSS
GitHub E-Mail
Links
  • Flowsnow
© 2021 AnyISalIn | Symbols count total: 167k | Reading time total: 2:47
Powered by Hexo
|
Theme — NexT.Mist v6.0.4