Python/Django中PHP“in”函数的等效函数

Posted

技术标签:

【中文标题】Python/Django中PHP“in”函数的等效函数【英文标题】:Equivalent funcion of PHP "ob" functions in Python/Django 【发布时间】:2014-03-01 19:44:07 【问题描述】:

是否有任何函数可以实现与 php ob_start(myCallbackFunction)ob_end_flush() 相同的结果,允许我修改 Python 框架(Django/其他)中的布局和视图?谢谢!

更新

<?php
ob_start(function($res)
   echo str_replace('test','new string',$res);
);
?>

test
test
test
test

<?php ob_end_flush(); ?>

【问题讨论】:

您可以在您的预期用例上进行扩展吗?虽然我想不出直接的替代方案,但可能有一种更常见的 django-ic 方式来实现相同的最终结果。 另外,您似乎可以使用yield 来模拟缓冲区。看到这个:***.com/questions/1371020/django-flush-response 更新了我的问题,我想做类似的事情 您可能应该在需要的地方发布 Python 代码,而不是发布 PHP 代码,因为您不能像在 PHP 中那样在 Django 中逐个打印响应,因此您的问题不会很有道理。 【参考方案1】:

要直接在 Python 中实现此结果,您可以按照此处讨论的方式修补 stdout/stderr;

Temporarily Redirect stdout/stderr

对于 Django 模板,您只需将调用包装在一个块(或单独的文件)中,并在必要时包含它们。

值得一提的是,这种方法不是很pythonic,您应该考虑一下您要做什么,并找到一种更pythonic的方法来实现它。如果您告诉我们更多有关您的用例的信息,我们或许可以提出更好的方法。

【讨论】:

在我的 php 代码中,每个视图和布局都有用于替换字符串的 ob 函数,例如网络论坛上的一些过滤器。并且 ob 函数将回调到一个控制需要替换哪些字符串的助手,我正在考虑转移到 python 但不知道如何实现这一点【参考方案2】:

让我们在python3中实现PHP的ob_start和ob_get_contents函数。

输出被存储在一个文件中,任何类型的流都可以使用。

from functools import partial
output_buffer = None
print_orig = print
def ob_start(fname="print.txt"):
    global print
    global output_buffer
    print = partial(print_orig, file=output_buffer)
    output_buffer = open(fname, 'w')
def ob_end():
    global output_buffer
    close(output_buffer)
    print = print_orig
def ob_get_contents(fname="print.txt"):
    return open(fname, 'r').read()

用法:

print ("Hi John")
ob_start()
print ("Hi John")
ob_end()
print (ob_get_contents().replace("Hi", "Bye"))

会打印

嗨约翰 再见约翰

【讨论】:

以上是关于Python/Django中PHP“in”函数的等效函数的主要内容,如果未能解决你的问题,请参考以下文章

安装频道:Python Django 版本和设置

Error: That port is already in use——Python Django

Error: That port is already in use——Python Django

八Python Django数据库添加查询

转 PHP in_array() 函数

php in_array函数的使用