一步一步教你用python最火的框架搭建自己的天气接口django+rest_framework=>返回天气数据
1策略 从什么地方获取天气数据?
爬虫获取www.weather.com.cn/ 或者爬取各大网站的天气数据 基本上国内的天气都从这获取的2:借用现成的接口
将数据获取到 保存到数据库上 来为自己的网站提供服务3:怎么 展示?怎么做接口?如何规范
可以利用django+rest_framework做接口(优雅的接口)4开始行动
1新建django项目 (我的另一篇博客有详细步骤)  来看一下目录结构 卷 文档 的文件夹 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.使用:
-
注册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)
这样的话我们就有了初步的接口(有很多不足,后面改进)
访问一下
这样就拿到了天气信息 细心的小伙伴注意到了 ,数据是字符串格式的 是不服和规范的,咱们后续改进