这是django的视图层。
Request Response对象
HTTP请求与Django Request对象 HTTP请求 请求方法
headers
请求参数
cookies
请求端信息
上面这5个对应于Django Request的数据是:
请求方法——Request对象的method属性
客户端信息——Request对象的META属性
cookies——Request对象的COOKIES属性
请求参数——Request对象中QueryDict
我们创建了一个叫做 django_test 的项目,关于如何创建项目,请参考我写的相关文章。
然后,我创建了一个叫做 apis 的 app 。
里面的目录结构如下
值得一提的是,原来要创建一个 app 的话,会在 apis 下面创建一个 views.py 的文件,但是,我们创建了一个叫做 views 的文件夹,用来存放视图文件。
在配置路由的时候会出现
from .views import weather
所以,我们要把 views.py 删掉,不然会使得路由冲突。
在 apis 中的 urls.py 中,我们编写
1 2 3 4 5 6 from django.urls import pathfrom .views import weatherurlpatterns = [ path('' ,weather.helloworld) ]
在总的 urls.py 下我们编写
1 2 3 4 5 6 7 from django.contrib import adminfrom django.urls import path,includeurlpatterns = [ path('admin/' , admin.site.urls), path('weather/' ,include('apis.urls' )) ]
然后在 setting.py 中,我们注释 MIDDLEWARE 中的
'django.middleware.csrf.CsrfViewMiddleware',
我们在 views 文件夹之下,创建 weather.py 文件,里面编写
1 2 3 4 5 6 7 8 from django.http import HttpResponsedef helloworld (request) : print('request method:' ,request.method) print('request META:' ,request.META) print('request cookies:' ,request.COOKIES) print('request QueryDict:' ,request.GET) return HttpResponse('OK' )
然后我们运行
python manage.py runserver
通过 postman 软件,我们访问,就能得到正确得回应
我们也可以在控制台看见输入的信息,在这里就不展示了。
HTTP应答与Django Response对象 状态码 Response对象中的status属性
应答内容 Response对象中的content属性
内容格式 眼伸的Response字类——(JosonResponse、FileResponse)
应用 from django.http import HttpResponse,JsonResponse,FileResponse
1 2 3 4 5 6 7 8 9 10 11 12 13 from django.http import HttpResponse,JsonResponse,FileResponsedef helloworld (request) : print('request method:' ,request.method) print('request META:' ,request.META) print('request cookies:' ,request.COOKIES) print('request QueryDict:' ,request.GET) m = { 'message' : "hello Django Response" } return JsonResponse(data=m,safe=False ,status=200 )
实战:实现天气查询应用
使用了第三方聚合数据的API
在总目录下新建一个 thirdparty 文件夹,里面有两个文件 init .py 里面什么内容都没有,juhe.py 里面封装了API代码。
目录结构如下:
juhe.py的内容如下:
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 import jsonimport requestsdef weather (cityname) : """ :param cityname: 城市名字 :return: 返回实况天气 """ key = '9a3e1fa6cb79d69f1594af5cb219a469' api = 'http://v.juhe.cn/weather/index' params = 'cityname=%s&key=%s' % (cityname, key) url = api + '?' + params print(url) response = requests.get(url=url) json_data = json.loads(response.text) print(json_data) result = json_data.get('result' ) sk = result.get('sk' ) response = dict() response['temperature' ] = sk.get('temp' ) response['wind_direction' ] = sk.get('wind_direction' ) response['wind_strength' ] = sk.get('wind_strength' ) response['humidity' ] = sk.get('humidity' ) response['time' ] = sk.get('time' ) return response if __name__ == '__main__' : data = weather('深圳' )
我们将 apis 下views 文件夹内的 weather.py 文件内容改成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 from django.http import HttpResponse,JsonResponse,FileResponsefrom thirdparty import juhedef helloworld (request) : print('request method:' ,request.method) print('request META:' ,request.META) print('request cookies:' ,request.COOKIES) print('request QueryDict:' ,request.GET) m = { 'message' : "hello Django Response" } return JsonResponse(data=m,safe=False ,status=200 ) def weather (request) : if request.method == 'GET' : city = request.GET.get('city' ) data = juhe.weather(city) return JsonResponse(data=data,status=200 ) else : print("no support method" )
然后 apis 下的 urls.py 文件改成
1 2 3 4 5 6 from django.urls import pathfrom .views import weatherurlpatterns = [ path('' ,weather.weather) ]
最后我们通过 postman 发送 127.0.0.1:8000/weather/?icity=”深圳”
但是,结果是失败的,可能的原因是,这个juhe.py 的代码已经过期。
我们继续完善,加上 POST 方法
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 from django.http import HttpResponse,JsonResponse,FileResponsefrom thirdparty import juheimport jsondef helloworld (request) : print('request method:' ,request.method) print('request META:' ,request.META) print('request cookies:' ,request.COOKIES) print('request QueryDict:' ,request.GET) m = { 'message' : "hello Django Response" } return JsonResponse(data=m,safe=False ,status=200 ) def weather (request) : if request.method == 'GET' : city = request.GET.get('city' ) data = juhe.weather(city) return JsonResponse(data=data,status=200 ) elif request.method == 'POST' : received_body = request.body receviced_body = json.loads(received_body) cities = received_body.get('cities' ) response_data = [] for city in cities: result = juhe.weather(city) response_data.append(result) return JsonResponse(data=response_data,status=200 ,safe=False )
利用 postman 发送 POST 请求