您的位置首页生活百科

如何用Python写一个web框架

如何用Python写一个web框架

的有关信息介绍如下:

如何用Python写一个web框架

STEP.1

我们首先得选择基于什么协议来写这种框架。我们可以选择CGI协议,或者是WSGI接口。如果使用CGI,实际上我们只是按着CGI的规范写了一个python程序,然后每次服务器收到请求,就fork一个程序来执行它,然后返回一个h远血供差四静水儿雷被威ttp文档,性能比较低下。对于WSGI,而是一个存在于服务器和应用间的接口,在WSGI之前,web应用都是依赖于服务器的,现在流鱼受血行的python框架都支大思高协批沉社怕持WSGI接口。

STEP.2PEP-333

这一段是PEP-333所提供的样例代码。

defsimple_app(envi损属ron,start_re道行制概初先好sponse):

"""Simplestpossibleapplicationobject"""

st象轴个脚补载便史厚植属atus='200OK'

response_headers=[('Content-type','text/plain')]

start_response(status,response_headers)

return['Helloworld!\n']

这里的application被传入了两个值。

environ

start_response。

environ是一个字典,保存了http请求的信息。

start_response是一个函数,发送http响应。她有两个参数status和start_headers。

status必须是由状态编号和具体信息组成的字符串,必须符指春周济皇好六合RFC2616。

start_headers是一个(header_name,header_value)元组的列表元组列表。其中的hearder_name必架林集限轮管混频座纪刑须是合法的httpheader字段名。在RFC2616,Section4.2中有详细定义。

当然官方还给出了类的实现。

 def__init__(self,environ,sta飞简盟rt_response):

    self.environ=e作士强增板端眼沿低李六nviron

    self.start=start_response

  def__苗生想害钢iter__(self):

    status='200OK'

    response_headers=[('Content-type','text/plain')]

    self.start(status,response_headers)

    yield"Helloworld!\n"

了解了如上信息后,基本上可以开督翻板刑屋存皇衣助置居始了。我们就到官方给的代码上进行修改吧。

STEP.3将路口句印众系本径链接到函数

首先我们得把用户请求的路径,链接到函数。我们可以实现一个getPage方法,专门做这件事。我们所拥有的信息,只有environ['PATH_INFO']。

urls=[('^/i率劳ndex/$','func_index'),

    ('^/comment/$','func_comment'),

    ('^/考委environ/$','get_environ'),

    ('^/post/$','post_test')]#urls是提供给app开发冷导延川以局束巴亮误哪者来做链接的。

  defg例周班呢肥福念空济etPage(self):

    path=self.environ['PATH_INFO']

    forpatterninself.urls:

      m=re.match(patter色n[0],path)#将urls元素的第0项和path进行比对,如果匹配上了,返回函数名

      ifm:

        function=getattr(self,pattern[1])#getattr方法来得到函数

        returnfunction()

    return'404notfound'#没匹配上任何东西

写到这里之后,每次添加页面,就只需要在urls列表中添加一个元祖就行了。

STEP.4获取模版

既然是写webapp,模版肯定是得有的。这里我提供了一种getTemplate方法来做这件事。不过我只提供了变量的替换。

  defgetTemplate(self,tem_name,rep=0):

    #这个函数返回内容,tem_name是文件名字

    #参数rep是一个字典,默认为0

    f=open('template/'+tem_name)

    html=f.read()

    if(rep!=0):

      forto_replaceinrep:

        strinfo=re.compile('\{\%\s*'+str(to_replace)+'\s*\%\}')

        html=strinfo.sub(rep[to_replace],html)

    returnhtml

STEP.5POST数据的处理

要想获取POST数据,我们得通过environ['wsgi.input']来处理。而他实际上就是系统的标准输入。

environ['wsgi.input']    =sys.stdin

知道这点后就很好写了。

  defgetPost(self):

    if(self.environ['REQUEST_METHOD']=='POST'):

      try:

        request_body_size=int(self.environ.get('CONTENT_LENGTH',0))#读出content_length的值

      except:

        request_body_size=0

      request_body=self.environ['wsgi.input'].read(request_body_size)#请求的body

      post_data=parse_qs(request_body)#parse_qs是cgi提供的方法,帮助我们处理请求

      returnpost_data

数据库的链接

importMySQLdb

classModel(object):

  def__init__(self):

      ***.host='localhost'

      self.port=3306

      self.user='admin'

      self.passwd='admin'

      self.db='xieyi'

  defbuild_connect(self):

    self.conn=MySQLdb.connect(

      host=***.host,

      port=self.port,

      user=self.user,

      passwd=self.passwd,

      db=self.db

      )

  defexec_ins(self,ins):

    cur=self.conn.cursor()

    num=cur.execute(ins)

    info={}

    if(num>0):

      info=cur.fetchmany(num)

    cur.close()

    self.conn.commit()

    returninfo

  defclose(self):

    self.conn.close()

STEP.6清理工作

很多配置如果放到代码中,会增加阅读负担。于是把urls,model抽取出来。

使得配置更加方便。