服务器项目准备工作,(一)准备工作

本小节大概要花费20分钟。

让我们在进入正题之前,先做一些准备工作。读者可以自行跳过自己熟悉的部分。

本小节主要内容有:

安装Django

新建Django项目

对一个简单的HttpRequest做出响应

解析带参数的URL

处理HTTP请求的body

1. 安装Django

$ pip3 install Django==2.0.5

pip3是python3中用来进行包管理的工具。

如果提示没有权限,则需要在pip3前sudo。另一种不需要sudo的方法是使用virtualenv。

安装成功后,我们就可以运行django-admin命令来创建项目了。

2. 新建项目

$ django-admin startproject task_platform

这里,我们新建了一个叫做task_platform的项目,其目录结构如图:

54a7b0255b20

新建的Django项目目录结构

其中:

manage.py用来运行Django项目的一些特殊功能

和项目名同名的文件夹task_platform中存放了项目根url路由(url.py)以及项目配置信息(settings.py)

wsgi.py我们暂时不考虑

这个时候,我们的项目已经可以运行了:

$ python3 manage.py runserver

... ...

Starting development server at http://127.0.0.1:8000/

Quit the server with CONTROL-C.

这条命令会让Django启动一个临时的服务器。如上,你会收到提示说,服务器已经在 http://127.0.0.1:8000/ 开启了。用浏览器访问 http://127.0.0.1:8000/,就可以看到Django提供的初始界面了:

54a7b0255b20

Django提供的初始页面

3. 对一个简单的HTTP Request做出响应

我们在task_platform下(存放url.py和settings.py的那个目录),新建一个views.py,里面保存用来进行响应的函数。

# task_platform/views.py

from django.http import HttpResponse

def test_function(request):

return HttpResponse("Hello World!")

这个函数很简单:在接收到请求后,直接返回“Hello World!”。

接下来我们再在 task_platform/urls.py 中添加一个 url 路由:

# task_platform/urls.py

from django.contrib import admin

from django.urls import path

from task_platform import views # added

urlpatterns = [

path('admin/', admin.site.urls),

path('test/', views.test_function), # added

]

这个路由的意思是:如果 Django 接收到的URL是“test/”,比如你用浏览器访问地址 http://127.0.0.1:8000/test/ ,那么则调用views.test_function来对这个请求进行响应。

让我们将服务器运行起来试一下

$ python3 manage.py runserver

... ...

Starting development server at http://127.0.0.1:8000/

Quit the server with CONTROL-C.

在浏览器里访问 http://127.0.0.1:8000/test/ ,你就能接收到Hello World啦!

4. 解析带参数的URL

比如这样一个URL: http://example.com/?var1=Django&var2=REST,它在请求 http://example.com/的时候,携带了两个参数:var1的值是"Django", var2的值是"REST"。在Django中,通过request.GET就能得到URL中的参数,比如,我们将之前的test_function修改为:

# task_platform/views.py

# ... ...

def test_function(request):

var1 = request.GET["var1"]

var2 = request.GET["var2"]

return HttpResponse("{var1} {var2}".format(var1=var1, var2=var2))

这个函数的意思是,在URL中拿到var1和var2两个参数,并将他们拼接的字符串返回。重新运行一下服务器,访问 http://127.0.0.1:8000/test/?var1=Hello&var2=World,就可以看到和之前一样的“Hello World”了。当然你也可以自由改变url中var1和var2的参数,来查看不同的返回结果。

练习:请用这种方法,在服务器端完成一个加法接口,即在接收到var1和var2后,服务器将其转化为数值,相加后返回。

5. 解析HTTP请求的body

一般,HTTP请求的报文格式如下:

其中有GET、POST、PUT、DELETE等。协议版本现在一般都是HTTP/1.1。其它头信息包括如Host、Content-Type、Cookies等。头信息和body之间有一个空行。在GET方法中,所有的参数都是写到URL里面的,因此GET请求没有body。比如我们在上面发起的请求,其内容为:

GET /test/?var1=Hello&var2=World HTTP/1.1

Host: 127.0.0.1:8000 # 头信息

Connection: keep-alive # 头信息

... ... # 其它头信息,没有body

我们接下来要讨论的是POST方法。用户在发送POST请求的时候,可以向body里添加信息,如下面这个POST请求:

POST /test/ HTTP/1.1

... ... # 其它头信息

Hello World

最后一行就是这个POST请求的body。在Django中,我们可以通过request.body来访问这部分数据。我们将我们的test_function进行一些修改:

# task_platform/views.py

# ... ...

def test_function(request):

return HttpResponse("{var}".format(var=request.body))

然后使用Postman(一个模拟HTTP请求的工具,因为我们暂时没有前端,所以这个工具会一直用到。下载Postman请访问 https://www.getpostman.com/apps)来进行一个POST请求的模拟:

54a7b0255b20

用Postman模拟POST请求

当我们点击Send后,却发现服务器返回了403 Forbidden,并且提示说“CSRF cookie not set”。这是Django出于安全考虑,要求每个POST请求都要带一个csrf_token。我们先不关注它,在settings.py里将这个功能关闭:

MIDDLEWARE = [

'django.middleware.security.SecurityMiddleware',

'django.contrib.sessions.middleware.SessionMiddleware',

'django.middleware.common.CommonMiddleware',

# 'django.middleware.csrf.CsrfViewMiddleware', 注释掉这一行,关闭CSRF

'django.contrib.auth.middleware.AuthenticationMiddleware',

'django.contrib.messages.middleware.MessageMiddleware',

'django.middleware.clickjacking.XFrameOptionsMiddleware',

]

再试一次,我们就能重新收到Hello World了。但是格式是 b'Hello World',前面多了个b。这是因为Django将request.body理解为二进制数据序列,我们需要decode一下,来得到字符串:

# task_platform/views.py

# ... ...

def test_function(request):

return HttpResponse("{var}".format(var=request.body.decode('utf-8')))

再试一次,就正常了。

练习:尝试在POST的body中写入两个数,并完成两个数的加法后返回。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值