是否可以在不使用“任何”框架的情况下使用python对网络应用进行编程?

时间:2019-03-08 22:29:24

标签: python django web frameworks

我以前在PHP上工作,想了解python Web编程。但是对我来说,一切都是模棱两可的。

是否可以在没有“任何”框架的情况下使用python对网络应用进行编程?

我知道框架对我们来说很容易,即使有可能没有框架的程序Web应用程序,对于大型项目也不是合乎逻辑的。但是我的目标只是学习,因为我认为从框架开始编程不是一个好主意,我们应该了解Web应用程序中有关纯Python的一些信息。因此,假设我想制作一个非常非常简单的网页,例如hello world或小型计数器或小型api。请不要为我提供像flask这样的轻量级框架。我只想知道纯python是否可以创建网页?

1 个答案:

答案 0 :(得分:3)

是的,从技术上讲,您可以使用“纯python”创建网页,但您当然不希望这样做!编程中最美丽的部分是,有成千上万的人在努力创建“框架”,例如FlaskDjango,从而极大地简化了制作“框架”所需的工作。应用。

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

程序员懒惰。如果存在可以在代码中使用的快捷方式,则应该使用它(除非您确实有很好的理由不这样做)。

考虑以下示例:

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

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

或者我可以简单地在默认的python库中使用精彩的ast包并获得相同的结果:

import ast

myList = ast.literal_eval(myStringList)

print(myList[0]) # foo

stringToList函数的全部功劳归于ast package的创建者,因为我只是从源代码中复制了它。

要添加一个创建自己的程序包/框架的“充分理由”的示例,可以说我出于某种原因需要使用eval函数。众所周知,evaldangerous,一般来说,不应使用。如果我真的需要使用它,并且没有其他选择(咳嗽,literal_eval),唯一的解决方案是创建自己的eval函数版本,以避免使用可利用的代码