小编rei*_*ish的帖子

通过Cisco IPSec连接时,应用程序无法解析内部DNS条目

我使用Cisco IPsec连接到我的工作场所VPN.我使用OS X的本机Cisco IPSec客户端进行连接.我们有一个内部DNS服务器,用于保存内部站点的记录,例如scotty.infinidat.com.使用curl联系内部站点按预期工作.使用以下Python代码也可以:

import requests

resp = requests.get("http://www.google.com")
resp.raise_for_status()

resp = requests.get("http://scotty.infinidat.com")
resp.raise_for_status()
Run Code Online (Sandbox Code Playgroud)

但是,尝试在Go中实现等效操作失败:

包主

import (
    "fmt"
    "net/http"
)

func main() {
    _, err := http.Get("http://google.com/") // This works
    if err != nil {
        panic(fmt.Sprintf("Error contacting Google: %s", err))
    }

    _, err = http.Get("http://scotty.infinidat.com/") // This doesn't
    if err != nil {
        panic(fmt.Sprintf("Error contacting an internal site: %s", err))
    }
}
Run Code Online (Sandbox Code Playgroud)

连接到VPN时运行上面的程序会产生以下输出:

panic: Error contacting internal site: Get http://scotty.infinidat.com/: dial tcp: lookup scotty.infinidat.com on 10.135.1.1:53: no …
Run Code Online (Sandbox Code Playgroud)

dns vpn go

8
推荐指数
1
解决办法
641
查看次数

隐藏Jinja2模板中无法访问的链接

我们正在Flask + Jinja2中编写Web应用程序.该应用程序已注册用户,可以根据其角色访问某些页面.为了在服务器端实现这一点,我们只使用装饰页面:

@app.route('/action1')
@security_requirements(roles=['some_role'])
def action1():
    ...
Run Code Online (Sandbox Code Playgroud)

装饰器检查登录的用户是否在其角色列表中具有"some_role",并决定是将调用传递给修饰函数还是仅将用户重定向到"拒绝访问"页面.

该应用程序还有一个使用bootstrap实现的导航栏.使用基本模板在每个页面中显示导航栏.至于现在,应用程序中的每个页面都在导航栏中有一个条目,无论当前用户是否可以访问它.尽管这不是一个安全漏洞,但我想隐藏他们无法访问的用户页面.此外,我希望在不重复Jinja模板中允许的角色列表的情况下实现此功能.是否可以通过使用我当前的装饰器以某种方式在Jinja中实现此功能?

python permissions jinja2 flask web

7
推荐指数
2
解决办法
3255
查看次数

同一个Python模块的两个实例?

我创建了一个带有单个函数的Python模块,只打印'a!'.我打开了Python解释器并用2种不同的语法导入了模块

>>> import a
>>> from a import func
>>> func()
a!
>>> a.func()
a!
Run Code Online (Sandbox Code Playgroud)

此时我更改了func以打印其他内容,然后再次进行评估

>>> func()
a!
>>> a.func()
a!
Run Code Online (Sandbox Code Playgroud)

当然,由于未重新加载模块,因此这是预料之中的.然后我重新加载模块并期望两个函数都更新,但是:

>>> reload(a)
<module 'a' from 'a.py'>
>>> a.func()
aasd!
>>> func()
a!
Run Code Online (Sandbox Code Playgroud)

只有a.func似乎更新.我一直认为Python只保留同一模块的单个实例,但现在似乎有两个.我做了进一步的测试以验证我的声明,并在模块的顶层添加了一个print语句,然后重新启动了解释器并再次导入:

>>> import a
module imported
>>> import a
>>> from a import func
Run Code Online (Sandbox Code Playgroud)

这让我更加困惑,因为我希望看到"模块导入"两次.我做的第三个实验是全局变量实验:

>>> import a
module imported
>>> from a import GLOBAL_VAR
>>> GLOBAL_VAR = 5
>>> a.GLOBAL_VAR
1
>>> GLOBAL_VAR
5
>>> GLOBAL_VAR is a.GLOBAL_VAR
False
Run Code Online (Sandbox Code Playgroud)

所以有一个模块的实例,但内部对象的不同实例?如何用这种行为实现Gevent的猴子修补

python python-module python-2.7 python-internals

7
推荐指数
1
解决办法
2181
查看次数

Python 3.4 asyncio任务没有完全执行

我正在试验Python 3.4的asyncio模块.由于没有使用asyncio的MongoDB生产就绪包,我编写了一个小包装类,它在执行程序中执行所有mongo查询.这是包装器:

import asyncio
from functools import wraps
from pymongo import MongoClient


class AsyncCollection(object):
    def __init__(self, client):
        self._client = client
        self._loop = asyncio.get_event_loop()

    def _async_deco(self, name):
        method = getattr(self._client, name)

        @wraps(method)
        @asyncio.coroutine
        def wrapper(*args, **kwargs):
            print('starting', name, self._client)
            r = yield from self._loop.run_in_executor(None, method, *args, **kwargs)
            print('done', name, self._client, r)
            return r

        return wrapper

    def __getattr__(self, name):
        return self._async_deco(name)


class AsyncDatabase(object):
    def __init__(self, client):
        self._client = client
        self._collections = {}


    def __getitem__(self, col):
        return self._collections.setdefault(col, AsyncCollection(self._client[col]))


class AsyncMongoClient(object):
    def __init__(self, …
Run Code Online (Sandbox Code Playgroud)

python python-3.x python-asyncio

6
推荐指数
1
解决办法
1757
查看次数

在基于Gevent的应用程序中捕获TERM信号

我在Python中编写了一个基于Gevent的简单守护进程.守护进程需要在它存在之前进行一些清理,因此它必须能够处理TERM信号,执行清理并正常退出.在不基于Gevent的单线程守护进程中,我使用Python的信号模块为TERM信号设置信号处理程序.信号处理程序抛出一个被调用的用户定义的异常TermSignal.守护进程的主线程可以捕获TermSignal异常,进行清理并退出.

当我尝试在基于Gevent的守护进程中实现它时,此解决方案无法正常工作.该守护进程有一个主要的greenlet,它调用joinall了工作者greenlet.该joinall调用包含在try/except块中KeyboardInterrupt,该块捕获它,这允许守护进程在没有守护进程的情况下运行时进行清理.但是,当我实现上面的解决方案并向进程发送一个TERM信号时,我可以在控制台窗口中看到其中一个worker greenlet引发了TermSignal异常,而不是主greenlet.这个未被捕获的异常没有向主要的greenlet传播,尽管我joinallraise_error参数设置调用了面True.结果是其中一个工作者greenlet由于异常而崩溃,但守护进程根本没有退出.

python signals daemon gevent

5
推荐指数
1
解决办法
2248
查看次数

在 Rust 宏中将 ident 视为字符串

我有一个配置结构,其中包含一些顶级属性,我想将其放入各个部分中。我为了提供弃用警告,我制作了以下宏

macro_rules! deprecated {
($config:expr, $old:ident, $section:ident, $new:ident) => {
    if $config.$old.is_some() {
        println!(
            "$old configuration option is deprecated. Rename it to $new and put it under the section [$section]",
        );

        &$config.$old
    } else {
        if let Some(section) = &$config.$section {
            &section.$new
        } else {
            &None
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

}

这似乎没有按预期工作,因为宏参数没有在字符串中替换。如何改变宏才能达到想要的效果?

rust rust-macros

2
推荐指数
1
解决办法
2821
查看次数

试图导致"更糟糕的情况"快速排序

我在C中实现了一个quicksort实现,我试图弄清楚需要哪些输入才能导致更糟糕的案例性能.

根据维基百科:

总是以这种方式选择分区中的最后一个元素作为枢轴导致已排序列表或相同元素列表的性能(n ^ 2)不佳.

所以我试着这样做,这导致了以下代码.pivot始终是最后一个元素,输入是已排序的列表.

为了证明复杂性确实是n ^ 2,我创建了一个全局变量,我在每次迭代中递增,然后最终打印它.

我希望该程序可以打印:

Done in 64 iterations
Run Code Online (Sandbox Code Playgroud)

但是,它在28次迭代中完成了它.也许我对"复杂性"一词的理解是错误的?

c sorting algorithm quicksort time-complexity

0
推荐指数
1
解决办法
129
查看次数