是否可以在没有“任何”框架的情况下使用 python 编写 Web 应用程序? [关闭]

Posted

技术标签:

【中文标题】是否可以在没有“任何”框架的情况下使用 python 编写 Web 应用程序? [关闭]【英文标题】:Is it possible to program web app using python without "any" framework? [closed] 【发布时间】:2019-07-30 23:57:27 【问题描述】:

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

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

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

【问题讨论】:

是的,这是可能的。 这真的只是你想要做多少重新发明***的问题...... Python可以使用socket库监听和响应tcp端口,或者你可以更进一步并使用http.server 库,它为您提供了更多功能,但您仍然只是在处理确切的getpostdelete 等请求。 这个链接会回答你的问题Python web development with or without frameworks 如果学习是目标,这里有一个 3 小时的 PyCon 研讨会,由 Django 的共同创建者之一围绕该主题进行,它深入探讨了 Web 框架的组成部分 - "Let's Build A Web Framework" 是的,您可以像 20 年前那样使用带有 builtin cgi module 的良好旧 CGI(TBH 我当时使用 Perl CGI,但同样适用)。 【参考方案1】:

是的,从技术上讲,您可以使用“纯 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 函数,无论出于何种原因。众所周知,eval 是dangerous,一般来说不应该使用。如果我真的需要使用它,并且没有其他选择(咳咳,literal_eval),唯一的解决方案是创建我自己版本的 eval 函数,以避免出现可利用的代码。

【讨论】:

更好的是,您无法将对象转换为str 并调用该序列化! +1 你的意思是说没有框架的程序太难了,我们甚至不能轻易地制作没有框架的hello world页面???中级 python 程序员可以构建一个非常简单的页面,但他没有吗?还是高级学科? @AliMarasizadeh 抱歉,我不明白你的问题。 对不起我的英语不好:'(我想知道在 web 上用纯 python 创建 hello world 页面很难?是专业案例吗?希望你理解我的问题。

以上是关于是否可以在没有“任何”框架的情况下使用 python 编写 Web 应用程序? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用可以在没有 .net 框架的情况下运行的 UWP / Window 窗体 / WPF 创建独立的 exe(没有任何依赖项)?

是否可以在没有任何训练的情况下使用 Caffe Only 进行分类?

我可以在没有定位服务的情况下仅通过蓝牙框架访问信标设备吗?

如何在没有实体框架的情况下使用 ASP.NET Identity 3.0 [关闭]

是否可以在没有默认数据库的情况下使用 Laravel 4

是否可以在不干扰服务器的情况下使用 Charles 代理或任何其他工具故意生成错误 500