一步一步教你用python最火的框架搭建自己的天气接口django+rest_framework=>返回天气数据

版权声明:欢迎大家进群交流,QQ群166477105, 所有非原创内容来自网络,如有侵权联系我删除 https://blog.csdn.net/weixin_43063753/article/details/86423054

1策略 从什么地方获取天气数据?

爬虫获取www.weather.com.cn/ 或者爬取各大网站的天气数据 基本上国内的天气都从这获取的

2:借用现成的接口

将数据获取到 保存到数据库上 来为自己的网站提供服务

3:怎么 展示?怎么做接口?如何规范

可以利用django+rest_framework做接口(优雅的接口)

4开始行动

1新建django项目 (我的另一篇博客有详细步骤) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190113154734817.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzA2Mzc1Mw==,size_16,color_FFFFFF,t_70) 来看一下目录结构 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190113154932675.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzA2Mzc1Mw==,size_16,color_FFFFFF,t_70)
卷 文档 的文件夹 PATH 列表
卷序列号为 000E-4350
E:\PYTHON_PROJECT\WEATHER
│  db.sqlite3
│  manage.py
│  readme.md
│  tree.txt
│  

├─GetWeather
│  │  admin.py
│  │  apps.py
│  │  data.json
│  │  get_baidu_weather.py
│  │  models.py
│  │  tests.py
│  │  views.py
│  │  __init__.py
│  │  
│  ├─migrations
│  │  │  __init__.py

   

│          
├─templates
└─weather
    │  settings.py
    │  urls.py
    │  wsgi.py
    │  __init__.py

注意:重要 在项目中 你要清楚的知道你现在的项目到什么地步了,什么形态的,
所以 一般可以采用 分步骤开始,现在先测试一下项目是否能够启动

#在项目目录下
python manage.py runserver

Run 'python manage.py migrate' to apply them.
January 13, 2019 - 15:59:07
Django version 1.11.16, using settings 'weather.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

访问http://127.0.0.1:8000/ 看到页面 即表示django项目已经可以运行了

django+rest_framework=>返回天气数据

1:环境所需

1.1 python3.6

1.2 django1.11.16

1.3 djangorestframework 3.9

1.4 urllib3 1.23

CORS跨域

简单请求和非简单请求

简单请求同时满足两大类条件:

1请求方法:

	HEAD、GET、POST

2.请求头

	Accept

	Accept-Language

	Content-Language

	Last-Event-ID

	Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

如果发送的是PUT或DELETE请求就是费简单请求

再比如发送的是 Content-Type:application/json也是非简单请求

简单请求的处理方案:

在响应头加一个Access-Control-Allow-Origin *  --》 允许任何源给我发跨域请求

在响应头加一个Access-Control-Allow-Origin 127.0.0.1:8000  --》只允许  127.0.0.1:8000 给我发跨域请求

非简单请求:

浏览器会提前发一个 OPTIONS的预检请求

在响应头加一个Access-Control-Allow-Methods:'PUT, DELETE'  --》允许浏览器给我发PUT和DELETE的跨域请求

在响应头加一个Access-Control-Allow-Headers: 'Content-Type'  --》 允许浏览器给我发请求头中修改Content-Type字段

使用django-cors-headers包

pip install django-cors-headers

在中间件中注册

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',  # 添加中间件
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

在Django的settings.py中配置:

CORS_ORIGIN_ALLOW_ALL = True  # 允许任何网站都来发跨域请求

配置可跨域访问的白名单:

CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = (
    # '<YOUR_DOMAIN>[:PORT]',
    '127.0.0.1:8080'
)

Django REST framework

1.安装:

pip install djangorestframework

2.使用:

  1. 注册app (不是必须)注册之后能够在页面的视图中看到
    INSTALLED_APPS = [
    #…
    ‘corsheaders’,
    ‘rest_framework’
    ]
    常规的django操作
    1创建超级用户
    >python manage.py createsuperuser
    >Username (leave blank to use ‘administrator’): root
    >Email address:直接回车表示不填写
    >Password:密码
    >Password (again):密码
    Superuser created successfully.
    2修改时区和后台显示语言
    # LANGUAGE_CODE = ‘en-us’
    LANGUAGE_CODE = ‘zh-hans’

    # TIME_ZONE = 'UTC'
    TIME_ZONE = 'Asia/Shanghai'
    

weather/urls.py


from GetWeather import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^weather/(?P<city>.+)/$', views.WeatherDetail.as_view())
]

GetWeather /get_baidu_weather.py

from urllib import request
from urllib import parse
from urllib.request import urlopen


def GetWeather(city):
    # print(city)
    values = {'city': city}
    data = parse.urlencode(values).encode('utf-8')
    url = 'https://www.baidu.com/home/other/data/weatherInfo'
    weather_request = request.Request(url, data)
    response = urlopen(weather_request)
    weather = response.read().decode()
    # print(weather)
    return weather
#主要是用户来获取天气的
#只有可以改造成存储到数据库

def main():
    city = '北京'
    GetWeather(city)


if __name__ == '__main__':
    main()

GetWeather /views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from GetWeather.get_baidu_weather import GetWeather


class WeatherDetail(APIView):
    def get(self, request, city=None):
        # print('city', city)
        # weather_data = GetWeather('北京')
        weather_data = GetWeather(city)
        # print('weather_data', weather_data)
        return Response(weather_data)

这样的话我们就有了初步的接口(有很多不足,后面改进)
访问一下
在这里插入图片描述
这样就拿到了天气信息 细心的小伙伴注意到了 ,数据是字符串格式的 是不服和规范的,咱们后续改进

猜你喜欢

转载自blog.csdn.net/weixin_43063753/article/details/86423054
今日推荐