大家好,今天小编来为大家解答以下的问题,关于在线网站源码分享修改,在线网站源代码这个很多人还不知道,现在让我们一起来看看吧!
引言
本文主要说明如何在MicroPythonPicoweb应用程序中返回特定的HTTP代码。
我们将使用一个叫做http_error的函数。这个函数其实也可以返回其他类型的HTTP代码,比如在2xx范围内的代码(成功代码)。可用的HTTP响应代码可参见此处(https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)。
测试使用的是一个集成在ESP32开发板中的DFRobot的sp-wroom-32设备。代码开发是在MicroPythonIDEuPyCraft上完成的。你可以在前一篇文章:ESP32MicroPython教程:uPyCraftIDE入门中查看如何使用uPyCraft。
尽管本文将使用一个特殊的函数来返回状态代码,但是上一篇教程中用来将第一部分HTTP响应发送给客户端的start_response函数也有一个可选的状态参数可用于返回特殊的HTTP代码。默认情况下,其返回值是200,对应于OK[1]。
start_response函数代码如下:
[/align]Copyright(c)2014-2018PaulSokolovsky\nProvideminimaldetectionofimportantfile\nInstantiatedlazily\nself.template_loader=None\nself.headers_mode=”parse”\n\ndefparse_headers(self,reader):\nheaders={}\nwhileTrue:\nl=yieldfromreader.readline()\nifl==b”\\r\\n”:\nbreak\nk,v=l.split(b”:”,1)\nheaders[k]=v.strip()\nreturnheaders\n\ndef_handle(self,reader,writer):\nifself.debug>1:\nmicropython.mem_info()\n\nclose=True\ntry:\nrequest_line=yieldfromreader.readline()\nifrequest_line==b””:\nifself.debug>=0:\nself.log.error(“%s:EOFonrequeststart”%reader)\nyieldfromwriter.aclose()\nreturn\nreq=HTTPRequest()\nprint(“================”)\nprint(req,(method,path,qs,proto),req.headers)\n\nprint(path,”vs”,root)\nifpath[:len(root)]==root:\napp=subapp\nfound=True\npath=path[len(root):]\nifnotpath.startswith(“/”):\npath=”/”+path\nbreak\nifnotfound:\nbreak\n\nFindhandlertoservethisrequestinapp’surl_map\nfound=False\nforeinapp.url_map:\npattern=e[0]\nhandler=e[1]\nextra={}\niflen(e)>2:\nextra=e[2]\n\nifpath==pattern:\nfound=True\nbreak\nelifnotisinstance(pattern,str):\npatternmatcher,whose.match()methodiscalled.(Note:\nefficientandwe’renotexactlycompatiblewithDjango\nprint(req,”Afterresponsewrite”)\nexceptExceptionase:\nifself.debug>=0:\nself.log.exc(e,”%.3f%s%s%r”%(utime.time(),req,writer,e))\n\nifcloseisnotFalse:\nyieldfromwriter.aclose()\nif__debug__andself.debug>1:\nself.log.debug(“%.3f%sFinishedprocessingrequest”,utime.time(),req)\n\ndefmount(self,url,app):\n”Mountasub-appattheurlofcurrentapp.”\nsubappswouldratherbehandledbynormalroutes,but\nthatparadigmaticallythere’sdifferencebetweenhanding\napp,Bottle’swaywasfollowed.\napp.url=url\nself.mounts.append(app)\n\ndefroute(self,url,**kwargs):\ndef_route(f):\nself.url_map.append((url,f,kwargs))\nreturnf\nreturn_route\n\ndefadd_url_rule(self,url,func,**kwargs):\nbecauseit’sallegedbloat.\nself.url_map.append((url,func,kwargs))\n\ndef_load_template(self,tmpl_name):\nifself.template_loaderisNone:\nimportutemplate.source\nself.template_loader=utemplate.source.Loader(self.pkg,”templates”)\nreturnself.template_loader.load(tmpl_name)\n\ndefrender_template(self,writer,tmpl_name,args=()):\ntmpl=self._load_template(tmpl_name)\nforsintmpl(*args):\nyieldfromwriter.awrite(s)\n\ndefrender_str(self,tmpl_name,args=()):\nL42)即可返回错误代码,函数参数是以字符串格式表示的客户端数据流写入器对象和错误代码。内部服务器错误对应的代码是500[1]。您也可以对其他状态代码进行测试。
由于该函数内部使用了数据流写入器的awrite方法,所以我们需要使用yieldfrom关键字。
\nyieldfrompicoweb.http_error(resp,”500″)\n
最后,只需调用app(应用程序)实例的run(运行)方法启动服务器即可。最终的源代码如下所示,其中包含了函数调用(使用分配给ESP32的IP地址)。
\nimportpicoweb\nimportnetwork\nssid=”yourNetworkName”\npassword=”yourPassword”\nstation=network.WLAN(network.STA_IF)\nstation.active(True)\nstation.connect(ssid,password)\nwhilestation.isconnected()==False:\npass\nip=station.ifconfig()\napp=picoweb.WebApp(__name__)\n@app.route(“/internalerror”)\ndefinternalError(req,resp):\nyieldfrompicoweb.http_error(resp,”500″)\napp.run(debug=True,host=ip[0])\n
测试代码
要对代码进行测试,只需将脚本上传到ESP32开发板运行即可。脚本执行时,控制台上会显示一条消息,表示服务器正在监听的根路径。
您只需将URL复制到一个网页浏览器中并在后面加上internalerror字样(对应于应用程序正在监听的路由)。所得到的输出结果如图1所示。请注意,我打开了Chaome浏览器的开发者工具选项,以查看更详细的请求信息。
图1-返回的内部服务器错误HTTP代码。
如引言部分所述,尽管该函数名为http_error,但是实际上我们也可以用它来返回非错误代码(比如对应于新建资源的代码201[1])。被返回的HTTP代码如图2所示。注意,我仅仅在之前的代码中把传递给http_error的状态代码从500改成了201,所以路由仍将其称为“internalerror”。
图2-修改的HTTP代码。
注:本文作者是NunoSantos,他是一位和蔼可亲的电子和计算机工程师,住在葡萄牙里斯本(Lisbon)。
他写了200多篇有关ESP32、ESP8266的有用的教程和项目。
查看更多ESP32/ESP8266教程和项目,请点击:DF创客社区-分享创造的喜悦
?原文点击
关于在线网站源码分享修改,在线网站源代码的介绍到此结束,希望对大家有所帮助。
