python3 web开发

python3 web开发
python教程推荐 廖雪峰 - python3教程

wsgi

wsgi: Web Server Gateway Interface

html.py

def html(environ,status): ## environ是一个包含http请求信息的dict对象,status是http响应
    status('200 OK',[('Content-Type','text/html')])
    body='<h1>Hello, %s!</h1>' % (environ['PATH_INFO'][1:] or 'Otokaze')
    return [body.encode('utf-8')]

server.py

from wsgiref.simple_server import make_server
from test_web_html import html

httpd=make_server('',8000,html)
print('Listen http request on 8000......')
httpd.serve_forever()

web框架

flask

pip install flask

flask_server.py

from flask import Flask,request,render_template

app=Flask(__name__)
rt=render_template

@app.route('/',methods=['GET'])
def index():
    return rt('index.html')

@app.route('/index.html',methods=['GET'])
def index_2():
    return rt('index.html')

@app.route('/login.html',methods=['GET'])
def login():
    return rt('login.html')

@app.route('/login.html',methods=['POST'])
def welcome():
    user=request.form['username']
    passwd=request.form['password']
    if user=='root' and passwd=='123456':
        return rt('welcome.html',username=user) ## username变量传递给了templates的html页面
    return rt('login.html',message='Bad username or password!',username=user) ## 同上!

if __name__=='__main__':
    app.run(host='0.0.0.0',port=80,debug=True)

jinja2模板

在Jinja2模板中,我们用{{ name }}表示一个需要替换的变量。
很多时候,还需要循环、条件判断等指令语句,在Jinja2中,用{% ... %}表示指令。

比如循环输出页码:

{% for i in page_list %}
    <a href="/page/{{ i }}">{{ i }}</a>
{% endfor %}

如果page_list是一个list:[1, 2, 3, 4, 5],上面的模板将输出5个超链接。

MVC

Model-View-Controller - “模型-视图-控制器”
Python处理URL的函数就是C:Controller,Controller负责业务逻辑
比如检查用户名是否存在,取出用户信息等等;

包含变量的模板就是V:View,View负责显示逻辑
通过简单地替换一些变量,View最终输出的就是用户看到的HTML。

MVC中的Model在哪?Model是用来传给View的
这样View在替换变量的时候,就可以从Model中取出相应的数据

cgi(请忽略)

-------- index.py --------
#!/usr/bin/python3
# -*- coding: utf-8 -*-

import cgi,os

print('Content-type: text/html\n')
print('<meta charset="UTF-8">')
print('<title>dashboard - hexo</title>')

try:
    form=cgi.FieldStorage()
    fileitem=form['filename']
    filename=fileitem.filename
    with open('/tmp/%s' % filename, 'wb') as f:
        data=fileitem.file.read()
        f.write(data)
    shell=os.system('sudo mv /tmp/%s /root/www.zfl9.com/source/_posts/' % filename)
    if shell == 0:
        msg='%s 上传成功!' % filename
    print('</h4>%s<h4>' % msg)
except BaseException:
    pass

print('''
<form enctype="multipart/form-data" action="/" method="post">
<p><input type="file" name="filename" /></p>
<p><input type="submit" value="上传文件" /></p>
</form>
<form action="/hexo.py" method="post">
<select name="dropdown">
<option value="hexo" selected>渲染markdown</option>
</select>
<input type="submit" value="确定"/>
</form>
''')
----------- index.py ---------------

---------- hexo.py -----------
#!/usr/bin/python3
# -*- coding: utf-8 -*-

import cgi,os

print('Content-type: text/html\n')
print('<meta charset="UTF-8">')
print('<title>dashboard - hexo</title>')

try:
    form=cgi.FieldStorage()
    hexo=form.getvalue('dropdown')
except BaseException:
    pass

if hexo == 'hexo':
    shell=os.system('sudo /sbin/myhexo')
    if shell == 0:
        msg='markdown 渲染完成!'
else:
    msg='markdown 渲染失败!'
    print('<h2>%s</h2>' % msg)
---------- hexo.py -----------