Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以使用python编写web应用程序而不使用;任何;框架_Python_Django_Web_Frameworks - Fatal编程技术网

是否可以使用python编写web应用程序而不使用;任何;框架

是否可以使用python编写web应用程序而不使用;任何;框架,python,django,web,frameworks,Python,Django,Web,Frameworks,我以前从事过PHP,希望了解python web编程。但对我来说,一切都是模棱两可的 是否可以在没有“任何”框架的情况下使用python编写web应用程序 我知道框架让我们一切都变得简单,即使没有框架也可以编程web应用程序,但对于大型项目来说,这是不合理的。但我的目标只是学习,因为我认为使用框架开始编程不是一个好主意,我们应该了解一些关于web应用程序中纯python的信息。想象一下,我想制作一个非常简单的网页,比如hello world、小计数器或小api。请不要给我提供像flask这样的轻

我以前从事过PHP,希望了解python web编程。但对我来说,一切都是模棱两可的

是否可以在没有“任何”框架的情况下使用python编写web应用程序


我知道框架让我们一切都变得简单,即使没有框架也可以编程web应用程序,但对于大型项目来说,这是不合理的。但我的目标只是学习,因为我认为使用框架开始编程不是一个好主意,我们应该了解一些关于web应用程序中纯python的信息。想象一下,我想制作一个非常简单的网页,比如hello world、小计数器或小api。请不要给我提供像flask这样的轻量级框架。我只是想知道纯python可以创建网页吗?

是的,从技术上讲,你可以用“纯python”创建网页,但你肯定不想!编程最美妙的部分是,还有数百万其他人努力创建“框架”,如
Flask
Django
,它们大大简化了制作应用程序所需的工作

如果你的目标是“只是学习”,那么使用一个你不熟悉的框架是一个很好的开始。学习编程并不是关于运行代码的各个方面所需的技术知识,而是了解如何针对您试图构建的特定应用程序提出正确的问题

程序员很懒。如果代码中有可以采用的快捷方式,您应该采用(除非您有很好的理由不这样做)

想想这个例子:

我有一个已转换为字符串的列表:

myStringList = "['foo', 'bar', 'foobar']"
如何将此字符串转换为计算机可以解释为列表的格式

我可以做这样一个函数:

def stringToList(node_or_string):
    if isinstance(node_or_string, str):
        node_or_string = parse(node_or_string, mode='eval')
    if isinstance(node_or_string, Expression):
        node_or_string = node_or_string.body
    def _convert_num(node):
        if isinstance(node, Constant):
            if isinstance(node.value, (int, float, complex)):
                return node.value
        elif isinstance(node, Num):
            return node.n
        raise ValueError('malformed node or string: ' + repr(node))
    def _convert_signed_num(node):
        if isinstance(node, UnaryOp) and isinstance(node.op, (UAdd, USub)):
            operand = _convert_num(node.operand)
            if isinstance(node.op, UAdd):
                return + operand
            else:
                return - operand
        return _convert_num(node)
    def _convert(node):
        if isinstance(node, Constant):
            return node.value
        elif isinstance(node, (Str, Bytes)):
            return node.s
        elif isinstance(node, Num):
            return node.n
        elif isinstance(node, Tuple):
            return tuple(map(_convert, node.elts))
        elif isinstance(node, List):
            return list(map(_convert, node.elts))
        elif isinstance(node, Set):
            return set(map(_convert, node.elts))
        elif isinstance(node, Dict):
            return dict(zip(map(_convert, node.keys),
                            map(_convert, node.values)))
        elif isinstance(node, NameConstant):
            return node.value
        elif isinstance(node, BinOp) and isinstance(node.op, (Add, Sub)):
            left = _convert_signed_num(node.left)
            right = _convert_num(node.right)
            if isinstance(left, (int, float)) and isinstance(right, complex):
                if isinstance(node.op, Add):
                    return left + right
                else:
                    return left - right
        return _convert_signed_num(node)
    return _convert(node_or_string)
myList = stringToList(myStringList)

print(myStringList[0] # [
print(myList[0]) # foo
这样称呼它:

def stringToList(node_or_string):
    if isinstance(node_or_string, str):
        node_or_string = parse(node_or_string, mode='eval')
    if isinstance(node_or_string, Expression):
        node_or_string = node_or_string.body
    def _convert_num(node):
        if isinstance(node, Constant):
            if isinstance(node.value, (int, float, complex)):
                return node.value
        elif isinstance(node, Num):
            return node.n
        raise ValueError('malformed node or string: ' + repr(node))
    def _convert_signed_num(node):
        if isinstance(node, UnaryOp) and isinstance(node.op, (UAdd, USub)):
            operand = _convert_num(node.operand)
            if isinstance(node.op, UAdd):
                return + operand
            else:
                return - operand
        return _convert_num(node)
    def _convert(node):
        if isinstance(node, Constant):
            return node.value
        elif isinstance(node, (Str, Bytes)):
            return node.s
        elif isinstance(node, Num):
            return node.n
        elif isinstance(node, Tuple):
            return tuple(map(_convert, node.elts))
        elif isinstance(node, List):
            return list(map(_convert, node.elts))
        elif isinstance(node, Set):
            return set(map(_convert, node.elts))
        elif isinstance(node, Dict):
            return dict(zip(map(_convert, node.keys),
                            map(_convert, node.values)))
        elif isinstance(node, NameConstant):
            return node.value
        elif isinstance(node, BinOp) and isinstance(node.op, (Add, Sub)):
            left = _convert_signed_num(node.left)
            right = _convert_num(node.right)
            if isinstance(left, (int, float)) and isinstance(right, complex):
                if isinstance(node.op, Add):
                    return left + right
                else:
                    return left - right
        return _convert_signed_num(node)
    return _convert(node_or_string)
myList = stringToList(myStringList)

print(myStringList[0] # [
print(myList[0]) # foo
或者我可以简单地使用默认python库中的奇妙的
ast
包,并获得相同的结果:

import ast

myList = ast.literal_eval(myStringList)

print(myList[0]) # foo
stringToList函数的所有功劳都归于的创建者,因为我只是从源代码复制了它


要添加一个创建您自己的包/框架的“好理由”示例,让我们假设出于任何原因我需要使用
eval
函数。我们都知道,
eval
是,一般来说,不应该使用。如果我真的需要使用它,而且没有其他选择(咳嗽,
literal\u eval
),唯一的解决办法就是创建我自己版本的
eval
函数,以避免有可利用的代码。

是的,这是可能的。这实际上只是你想做多少重新发明轮子的问题。。。Python可以使用
socket
库在tcp端口上侦听和响应,或者您可以进一步使用
http.server
库,该库为您提供了更多的功能,但您仍然只需要使用确切的
get
post
delete
,如果学习是你的目标,这个链接将回答你的问题,这里有一个由Django的一位共同创作者就这个主题举办的为期3小时的PyCon研讨会,它将深入探讨web框架的构成——是的,你可以像20年前一样使用好的旧CGI(TBH我当时使用Perl CGI,但同样的原则适用)。更好的是,您不能将对象转换为
str
,并称之为序列化+1你的意思是说没有框架的程序太难了,以至于没有框架我们连hello world页面都做不成???一个中级python程序员可以构建一个非常简单的页面,但他不能?或者是高级科目?@AliMarasizadeh抱歉,我不明白你的问题。抱歉我的英语不好:'(我想知道在web上用纯python创建hello world页面很难?是专业案例吗?我希望你理解我的问题。