写在前面
单位给我个任务,让我为他们的数据分析系统搭建一个实时的网络服务,他们以前的数据分析系统并不是实时地从数据库里读表,是每周人工更新。希望我帮他们搭建一个网站后端,实时从数据库里读表(数据库是SQL Server,他们已经建好了),返回前端人员JSON数据,前端人员负责显示。
而我一开始的思路是在WINDOWS上搭建好环境,然后再用filezilla上传到LINUX上。这种想法很幼稚因为:
- 当我发现在WIN上搭建Django的环境配置太麻烦,很多在WIN上需要安装的依赖包在LINUX上并不需要安
- 代码是可以移植的,环境是不能移植的。意味着我学完在WIN上怎么搭环境以后,还得从头学一遍LINUX上怎么搭环境。
-
综上所述,不如直接从LINUX上开始做
环境配置
- Linux系统版本:给我的是CentOS
- 我安装了 Pycharm,路径:
[root@ml-J33A3K Web]# cd /usr/Web/InstallPackage/pycharm-2017.3.4/bin
- 在该路径下输入如下命令,启动pycharm
[root@ml-J33A3K bin]# sh pycharm.sh
- 我安装了Anaconda3,路径:
[root@ml-J33A3K Anaconda3zy]# cd /usr/Web/Anaconda3zy
- 我把项目新建在,路径:
[root@ml-J33A3K ~]# cd /root/PycharmProjects/
[root@ml-J33A3K PycharmProjects]# ls
DJGDemo -
DJGDemo这个文件夹就是整个项目了
因为现在只有这么一个项目,所以启动pycharm以后默认就显示这个项目
- 在LINUX中输入conda list能查看我安装过的项目需要的依赖包如下:
-
django 2.0.2 py36hd476221_0
Django 2.0.3
django-cors-headers 2.2.0
django-pyodbc 1.1.3
django-pyodbc-azure 2.0.3.0
pyodbc 4.0.22 py36hf484d3e_0
freetds 1.00.9 0 (这个包我安了,但是好像没有用到它的地方,别删了比较保险)Django项目说明
新建项目时的参数选择
注意:
- 不要选Virtul env,这代表创建一个虚拟的PYTHON环境。我在WINDOWS上试过,这样安装的一些依赖包会直接安装到虚拟环境里,不会安装到系统环境里,适合从WIN到LINUX的环境移植。但我现在直接在LINUX上做,涉及不到环境从WIN移植到LINUX上,所以不选。而且如果选了,一些依赖包的管理我容易弄乱了,分不清到底装在了哪,所以不选。
- 在Exsiting Interpreter 处,点击右边的齿轮,选择“Add Local”,然后选择”Conda Environment”,再选择我安装的Anaconda3的Interpreter,具体如下:
-
More Settings 解读:
- Templates folder这个文件夹,templates是指我建的网站 那些HTML网页存放在这里(因为是前后端分离开发的,所以我没写网页)
- Application name: 后面填充的是要新建的APP的名字。
- 说明:
Django框架下 WEB项目和APP的关系如下:
一个WEB项目可以有多个APP:比如我建了一个网站(WEB项目),下面有博客系统(Application ),网上商城系统(Application )
一个APP可以存在多个WEB项目下:
比如我又建了一个网站(WEB项目),又想建一个博客系统(Application )和一个论坛系统(Application ),那我可以复用刚才第一个网站的博客系统 -
建完以后项目目录结构如下图:
说明:search.py是我手动添加的python文件
我修改过的、用过的只有标黄的文件,其他的文件都没动。
FirstAPP目录下就是一个Application,不知道以后会不会有用,就先新建出来。目前为止没有用到。项目文件用途说明:
search.py 最关键的定义API的地方
接口调用方法:
我下载了一个软件叫POSTMAN,可以测试API,截图如下:
调用search API如下:
调用getdata API如下:
search是我写的测试用的函数
getdata是我写的真正从数据库里读数据返回JSON的函数urls.py 定义路由规则:即在浏览器里输入url调用哪个函数
settings.py 整个项目的设置
设置了数据库的连接方式
试了无数次,这样写就能连上数据库了。这样配置是因为要与/etc/odbc.ini里已有的数据库配置文件相一致
/etc/odbc.ini文件内容如下:
settings.py里DATABASES的参数解读:
ENGINE我选择的是PYODBC方式
(好像还有种mysql的连接方式,试不对,弃用之)
NAME:数据库的名字(要与odbc.ini里Database=XXX 的XXX一样)
USER:用户名
PASSWORD:用户密码
HOST:数据库所在的主机的IP(要与odbc.ini里Server=XXX 的XXX一样)
OPTIONS里的driver:要与odbc.ini里Driver=XXX 的XXX一样解决CORS跨域问题
第一步:在settings.py里修改ALLOWED_HOSTS 为如下
ALLOWED_HOSTS = [‘*’]#allow all ip第二步:
我先安装了django-cors-headers
pip install django-cors-headers,
然后要在setting里改动如下:
(上图里标黄的是我添加的,下图都是我添加的)
运行服务 python manage.py runserver 0.0.0.0:8000
进到项目目录下 然后运行命令,具体如下:
[root@ml-J33A3K PycharmProjects]# cd /root/PycharmProjects/DJGDemo
[root@ml-J33A3K DJGDemo]# ls
db.sqlite3 DJGDemo FirstApp manage.py templates[root@ml-J33A3K DJGDemo]# python manage.py runserver 0.0.0.0:8000
Performing system checks…System check identified no issues (0 silenced).
March 22, 2018 - 04:16:03
Django version 2.0.3, using settings ‘DJGDemo.settings’
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
注意:
1.要写0.0.0.0:8000,才能被除服务器本身IP以外的其他IP访问
2.如果不写0.0.0.0:8000,就相当于在Pycharm环境中点绿色三角运行项目,这种情况网站只能被服务器本身IP访问。如何在后台运行(这样关闭SSH进程就可以不被杀死了)参见:
http://www.cnblogs.com/catmelo/archive/2013/05/06/3062014.html
简单来说就是 在命令后一个空格,然后写一个取地址符与数据库打交道时需注意的问题
判断空的单元格用 is None
在Navicat里看数据表里数据的本来形式是
做个试验:
运行manage.py在控制台里做试验:import django.db import connections
import numpy as np
curs=connections[‘default’].cursor()
curs.execute(“SELECT DISTICT PartLifecycle form 表名”)
wwd=curs.fetchall()
wwd[2]
(None,)
这是tuple形式
wwd[2][0] is None
Out[21]: True
wwd[2][0] is np.NAN
Out[22]: False
wwd[2][0] is 6
Out[23]: False