专栏首页用户2119464的专栏python_web(三)一个简单web后端框架

python_web(三)一个简单web后端框架

#简单的web后端框架
#coding: utf-8

import socket


def log(*args, **kwargs):
    print('log', *args, **kwargs)
#日志输出记录函数


def route_index():
    header = 'HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n'
    body = '<h1>hello world</h1><img src="/doge.gif">'
    #应将上式换做自己的图片路径
    r = header + '\r\n' + body
    return r.encode(encoding='utf-8')
#制作返回给客户端的内容,返回为bytes格式


def page(name):
    with open(name, encoding='utf-8') as f:
        return f.read()
#打开文件路径为name的html文件,返回值为文件编码后内容


def route_msg():
    header = 'HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n'
    body = page('html_basic.html')
    # 应将上式换做自己的html文件展现
    r = header + '\r\n' + body
    return r.encode(encoding='utf-8')
#制作返回给客户端的内容(其中含有html文件),返回为bytes格式


def route_image():
    with open('doge.gif', 'rb') as f:
        header = b'HTTP/1.1 200 OK\r\nContent-Type: image/gif\r\n'
        img = header + b'\r\n' + f.read()
        return img
#图片的处理函数,读取图片并生成响应返回(读取图片形式为rb,bytes)


def error(code = 404):
    e = {
        404: b'HTTP/1.1 404 NOT FOUND\r\n\r\n<h1>NOT FOUND</h1>',
    }
    return e.get(code, b'')
#404错误返回函数


def response_for_path(path):
    r = {
        '/': route_index,
        '/doge.gif': route_image,
        '/msg': route_msg,
    }
    response = r.get(path, error)
    return response()
#路由函数,不同地址,出现不同的结果,取不到地址,返回错误函数


def run(host='', port = 3000):
    with socket.socket() as s:
        s.bind((host, port))
        while True:
            s.listen(5)
            connection, address = s.accept()
            request = connection.recv(1024)
            log('raw, ', request)
            request = request.decode('utf-8')
            log('ip and request, {}\n{}'.format(address, request))
            try:
                path = request.split()[1]
                log('path, ', path)
                response = response_for_path(path)
                connection.sendall(response)
            except Exception as e:
                log('error', e)
                #异常时返回异常信息
            connection.close()
#服务器运行函数,运行,连接


def main():
    config = dict(
        host = '',
        port = 3000,
    )
    run(**config)
    #生成配置并运行程序


if __name__ == '__main__':
    main()

以上程序中所用到的知识点如下:

  • 日志函数

用法: def log(*args, **kwargs):

print('log', *args, **kwargs)

#python中一般不用print输出,而用log日志函数

  • 服务器返回HTTP数据的格式

r = header + '\r\n' + body

header部分

#HTTP/1.1 是版本 #200 是状态码 #OK 是状态码的描述

body部分

#body部分为html代码

  • with...as语句

用法:

with open("文件路径") as f:

data = f.read()

print(data)

相当于 try:

data = f.read()

except:

print("读取文件失败!")

else:

print(data)

finally:

f.close() # 使用 with 可以保证程序中断的时候正确关闭文件

  • 字典的get()方法

用法:dict.get(key,  default=None) #参数:key 字典中要查找的键 #返回值:返回指定键的值,如果值不在字典中返回第二个参数

  • **config

#真正的Python参数传递语法是** #**config只是一种约定俗成的编程实践 #表示函数接收可变长度的关键字参数字典作为函数的输入

  • if __name__ == '__main__':

#此部分与c语言的main函数同 #此为python的入口函数

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 数据结构概述

    限定仅在表尾进行插入和删除操作的线性表 分为顺序栈和链栈 顺序栈的拓展:两栈共享空间

    星辉
  • python_web(四)模拟HTTP客户端进阶版(内含测试函数)

    星辉
  • python入门(七)计算不同交通工具的行进耗时(类的用法和继承)

    星辉
  • laravel+react+webpack+babel+gulp的配置

    laravel composer create-project laravel/laravel --prefer-dist npm npm install gu...

    前朝楚水
  • CSS

    常见的块元素有:ul列表、form表单、h1-h6标题、hr水平线、p段落、div

    木瓜煲鸡脚
  • 7 比对到参考基因组输出bam文件

    接下来用 BWA mem把fastq map到参考基因组 hg38 版本。 比对结果直接通过管道传给samtools处理,节省 I/O 时间。 因为空间问题...

    Y大宽
  • 预测股市 | 如何避免p-Hacking,为什么你要看涨?

    我们计算标普500指数过去一年的表现及每日回报率。但是过去两年的估值并不那么不稳定

    量化投资与机器学习微信公众号
  • 六度CRM x 魔学院,尖物组合打造企业数字化销售部|腾讯SaaS加速器·案例库

    ? 来源 | 腾讯SaaS加速器首期项目-六度人和&魔学院 ---- 5月18日,腾讯云SaaS加速器成员六度CRM联合魔学院举办了一场主题为“因疫而变,销售...

    腾讯SaaS加速器
  • Django 2.1.7 处理ajax请求、GET、POST请求

    在业务处理的工作中,在同一个视图处理上,可能会有普通的GET、POST请求,还会有ajax请求。 那么怎么在处理这些请求的时候做上区分呢?

    Devops海洋的渔夫
  • EM算法求解pLSA主题模型

    说到主题模型通常会想到LDA主题模型。确实,近些年出现的主题模型或多或少与LDA模型存在联系,但是今天我们要介绍的是比LDA还要早的pLSA主题模型。

    触摸壹缕阳光

扫码关注云+社区

领取腾讯云代金券