使用Python搭建简单服务器

使用Python搭建简单服务器

Aron Lv3

本文所使用的python版本是python3,那么对应的pip版本也是pip3 .如果你是用的是python2.x的话,那么对应的终端指令就需要把python3换为python,pip3换为pip.

最简(简)单(陋)的方式

使用WSGI(Web Server Gateway Interface)

Python内置支持此模块,实现WSGI接口也非常的容易,只需要开发者实现一个函数,这里是一个Web版本的”Hello,World”:

1
2
3
4
5

def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [b'<h1>Hello, web!</h1>']

这里的application()方法就是符合WSGI接口标准的HTTP处理函数,此方法接收两个参数,第一个是一个接收HTTP请求参数的dict,第二个参数是一个发送HTTP响应的函数,方法内调用start_response('200 OK', [('Content-Type', 'text/html')])即发送的HTTP响应的Header,方法内的返回值就是单次HTTP请求所得到的返回值.

编写app.py文件,内容如下:

1
2
3
4
5
from wsgiref.simple_server import make_server
# 创建一个WSGIServer对象,IP地址为空,也就是本机地址,端口是8000,处理函数是application方法
httpd = make_server('',8000,application)
# 启动服务器
httpd.serve_forever()

此时在终端下执行此命令:

1
python3 app.py

此时这个简易的服务器就启动了,可在Chrome下输入域名localhost:8000,如无意外,页面内会有Hello,web这个h1标签产生的文字.

但是,此时如果想增加一些灵活性,比如说改为localhose:8000/signin返回登录页面,此时需要做的就是在application方法内通过environ['PATH_INFO']来获得访问路径,判断访问路径来返回不同的html,作为一个像我这样懒的人,我想说—–NO WAY!!

下面是更简单的方式实现:

使用Web框架

使用Flask

使用之前需要先安装flask,终端执行:pip3 install flask,别忘了如果你使用了virtualenv虚拟环境的话需要先进入虚拟的环境再安装,否则会被安装到系统默认的python环境中.

我们需要这些模块:

1
2
3
from flask import Flask
from flask import request
from flask import render_template

有了flask只有,如何解决上面的访问路径的问题呢?其实我们可以在方法定义的时候,就决定调用此方法的请求路径(path)以及请求方法(method),比如说是主页的话,可以这样:

1
2
3
4
5
app = Flask(__name__)

@app.route('/',methods=["GET","POST"])
def home():
return "<h1>Home</h1>"

app.route()装饰器的两个参数分别设定了访问路径,以及允许的请求方法.

但是,注意这里方法的返回值是直接把HTML字符串返回,难道需要把每个页面需要的HTML作为字符串放在python文件内吗? 不考虑其他专业性的问题,还是那句话,作为一个像我这么懒的人,我想说NO WAY!!.

模板技术

首先需要把所有页面的HTML代码写在独立的文件内,python内部使用的时候只需要引用文件并传入相应参数即可,对应这里的话就是把方法的返回值替换为return render_template('home.html'),这里的home.html文件内部把所需要的HTML内容放入即可.

那么剩下的代码:

1
2
3
4
5
6
7
8
9
10
11
@app.route('/signin',methods=['GET'])
def signin_form():
return render_template('form.html')

@app.route('/signin',methods=['POST'])
def signin():
username = request.form['username']
password = request.form['password']
if username == 'admin' and password == 'password' :
return render_template('signin-ok.html',username=username)
return render_template('form.html',message='Bad username or password',username=username)

这里登录与登录失败的时候,做了点小操作,重用了同一个页面,这是form.html的文件内容,注意这里在render_template()的时候使用关键字参数传入了参数,这些参数在html文件里面都有,对应的参数位置,flask默认的模板是jinja2,所以需要安装jinja2:

1
$ pip install jinja2

安装完成之后,这里看一下html文件的编写:

home.html

1
2
3
4
5
6
7
8
<html>
<head>
<title>Home</title>
</head>
<body>
<h1 style="font-style:italic">Home</h1>
</body>
</html>

form.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<html>
<head>
<title>Please Sign In</title>
</head>
<body>
{% if message %}
<!--这里的{% if message %}与下面的endif语句,当前者的条件判断为真时,则会执行两者之间的代码,否则将被略过-->
<p style="color:red">{{ message }}</p>
<!-- 这里的 {{ message }} ,相当于引用渲染模板是传入的关键字参数-->
{% endif %}
<form action="/signin" method="post">
<legend>Please sign in:</legend>
<!-- 这里的username同样是引用外部参数 -->
<p><input name="username" placeholder="Username" value="{{ username }}"></p>
<p><input name="password" placeholder="Password" type="password"></p>
<p><button type="submit">Sign In</button></p>
</form>
</body>
</html>

signin-ok.html

1
2
3
4
5
6
7
8
<html>
<head>
<title>Welcome, {{ username }}</title>
</head>
<body>
<p>Welcome, {{ username }}!</p>
</body>
</html>

使用Django

首先第一步需要安装django,直接使用pip安装即可:pip3 install django

现在你已经安装了django框架,然后怎么用呢?

创建项目

在终端内输入django-admin startproject mysite ,请注意,此命令会在当前目录下创建一个名为mysite的文件夹,此时此文件夹内的层级是这样的:

  • mysite
    • manage.py
    • mysite
      • __init__.py
      • settings.py
      • urls.py
      • wsgi.py

创建了项目之后,先进入项目文件夹,然后创建web app,这些操作翻译成终端指令就是:

1
2
cd mysite
python3 manage.py startapp myapp

此操作会在当前文件夹下创建一个名为myapp的文件夹.myapp文件夹下的层级是这样的:

  • myapp
    • __init__.py
    • admin.py
    • models.py
    • tests.py
    • views.py

如果是django1.8.x以上的版本,还会有一个migrations文件夹,django 1.9.x还会在1.8的基础上多出来一个apps.py文件

此时终端下输入:

1
python3 manage.py runserver

然后在浏览器访问

localhost:8000,访问成功就表示配置成功了.

此时在终端内按下CTRL+C即可关闭服务器.

Hello,world

打开myapp文件夹下的views.py,这个文件当前只有一行import语句,修改源码为:

1
2
3
4
from django.http.response import HttpResponse

def index(request):
return HttpResponse(b'Hello,world')

参数request就是浏览器访问页面时附带的请求信息,这里返回一个字符串作为请求结果.

然后再打开mysite文件夹下的urls.py ,编辑代码为:

1
2
3
4
5
6
7
8
from django.conf.urls import url
from django.contrib import admin
from myapp.views import index# 这里是修改的代码

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$',index,name='home')# 这里是修改的代码
]

这里的urlpatterns以列表的形式定义了服务器当前可被访问的页面地址,修改之后的的文件相较之前只改了两行代码,第一行负责把刚刚编辑的views.py文件内的index方法import进来,第二行代码绑定了主页的访问函数,请注意url方法第一个参数里的正则表达式就是页面访问地址,在这里理解为,当访问主页时,就会来到index函数这里.

此时在浏览器内刷新刚才的网页,如无意外的话,页面内应该有Hello,world这句话.

在Django内使用模板

毫无疑问django也是具备模板技术的,那么如何使用模板呢?

假如说这里的需求是,可以处理类似:

localhost:8000/name这样域名后附带用户姓名的URL,可以这样写:

这里先修改一下views.py中的index方法:

1
2
def index(request,name):
return render(request,'home.html',{"uname":name})

这里的意思是渲染home.html这个文件,第三个参数是渲染时附带的参数,返回给用户,然后需要创建这里的html文件:

myapp文件夹下创建文件夹templates,在此文件夹中创建文件home.html,html文件中:

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>欢迎!</title>
</head>
<body>
Hello,{{ uname }}
</body>
</html>

html文件内部的表示引用在渲染模板文件时传入的uname参数.

然后再修改urls.py,把之前的

1
url(r'^$',index,name='home')

这行代码换为

1
url(r'^(\w+)',index,name='home')

这里梳理一下,views.py负责提供页面所需要的视图内容,templates文件夹下的文件则是渲染视图时用的模板文件,需要在render()函数内使用,urls.py负责规定当前app可用于访问的URL,并捕获参数传入view层.

此时再次运行服务器,即可看到效果.其实如果不停止服务器,当你项目内的文件发生修改时,只要你settings.py中的debug模式确认打开,django会自动刷新的,也就是说不用停止服务器,直接在浏览器类刷新就可以看到效果.

移动端App

这里先简单说一下,其实移动端跟web端的请求方式都是一样的,单论返回内容来讲,区别只是如果是要在App内使用的话,普遍都是需要返回给移动端一段JSON文本内容,也就是说与web端相比,我们只需要把返回的HTML修改为JSON内容就OK.

使用Flask作为移动端服务器

首先可以依靠jsonify()函数得到标准的JSON格式并返回给客户端.

这里是一个简单的示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# coding:utf-8
from flask import Flask,jsonify

app = Flask(__name__)
GET = "GET"
POST = "POST"

# 模拟返回内容
response_list = {
"userList":[
{
"uname":"username1",
"uid": 1,
"uimg":"image link",
"udesc":"user description content"
},
{
"uname": "username1",
"uid": 1,
"uimg": "image link",
"udesc": "user description content"
}
]
}

@app.route("/user/list/",methods=[GET,POST])
def user_list():
return jsonify(response_list)

if __name__ == "__main__":
app.run(debug=True)

此时打开浏览器访问http://localhost:5000/user/list/即可看到与这里的response_list的内容一致的JSON文本.

  • 标题: 使用Python搭建简单服务器
  • 作者: Aron
  • 创建于 : 2016-09-20 09:15:09
  • 更新于 : 2025-10-14 09:29:25
  • 链接: https://likeso.github.io/2016/09/20/create-simple-web-app-using-python/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论