参考虫师的《Web接口开发与自动化测试基于Python语言》,决定自己开发一个简单的Django项目,以下就是全部开发过程。
1. 项目目标
展示指定的股票实时价格,通过用户输入股票买入价格,计算当前盈亏。
2. 项目工具
Django+Python+新浪股票API接口(免费)
3. 项目分析
3.1 登录页面
一个在线系统,当用户访问站点,首页展示给用户的应该是登录页面,所以我们需要一个登录页面,之前的练习里已经写过,但是我不想那么枯燥的展示,于是从网上直接找了个免费的登录模板,套用即可(只是这个套用过程,费了很多事,详细的请参见下面红色和蓝色字体)。
3.1.1 实现过程
有了大体的思路后,就开始实现吧!
建立项目:
django-admin startproject stock
建立应用:
python manage.py startapp diff
编写登录页面:
登录页面-login.html-网上拷贝的就不贴了
登录页面-urls.py
from django.conf.urls import url
from django.conf import settings
from django.contrib import admin
from diff import views
urlpatterns = [
url(r'^$', views.index),
url(r'^admin/', admin.site.urls),
]
- 登录页面-views.py
# /usr/bin python
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from django.shortcuts import render
# 登录页面
def login(request):
return render(request, "index.html")
- 效果图
编写登录功能
- 初始化数据库
python manage.py migrate
- 创建超级用户
python manage.py createsuperuser
- 登录功能-urls.py
from django.conf.urls import url
from django.conf.urls.static import static
from django.conf import settings
from django.contrib import admin
from diff import views
urlpatterns = [
url(r'^$', views.index),
url(r'^login_action/$', views.login_action),
url(r'^admin/', admin.site.urls),
]
- 登录功能-views.py
# 登录动作
def login_action(request):
if request.method == 'POST':
username = request.POST.get('username', '')
password = request.POST.get('password', '')
user = auth.authenticate(username=username, password=password)
if user is not None:
auth.login(request, user)
request.session['user'] = username
response = HttpResponseRedirect('待定还没想好下一步')
return response
else:
return render(request, 'index.html', {'error':'username or password error!'})
3.1.2 问题总结
注意1:
当模板使用css、js这些内容的时候,需要在settings.py中指定这些文件的目录:
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.10/howto/static-files/
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'diff/static')
STATICFILES_DIRS = (
('css',os.path.join(STATIC_ROOT,'css').replace('\\','/') ),
('js',os.path.join(STATIC_ROOT,'js').replace('\\','/') ),
('img',os.path.join(STATIC_ROOT,'img').replace('\\','/') ),
('scss',os.path.join(STATIC_ROOT,'scss').replace('\\','/')),
('fonts',os.path.join(STATIC_ROOT,'fonts').replace('\\','/') ),
)
并且需要在每次修改css等代码后,使用python manage.py collectstatic
命令来同步这些改动才能生效。
如果遇到访问的资源返回404错误,则需要在html代码中检查指定资源的位置是否有误。如果遇到访问的资源返回304错误,则同步资源后,客户端使用CTRL+F5来访问。
注意2:
套用网上的模板这件事,真心并不是那么简单,我以为随便下个模板,参考之前的登录页面修改下里面的代码就能使用了,可没想到上面那个模板在实际使用过程中,填写密码居然是明文展示的,我晕了,看来并不是随便一个模板都能随便套用的,不清楚前端代码,根本无从下手去修改。
于是我又换了一个相对简单的登录页面模板,这次相对简单,并且经过了好几天的研究,终于稍微懂点css代码了,就为了加个登录页面的标题,学习并尝试了好几天才搞定,一个在线工具,可以实时修改html和css代码同时展示效果:https://c.runoob.com/codedemo/2917
经过最终的修改后的登录页面效果如下:
3.2 展示页面
当用户登录成功后,就需要进入展示页面,计划是在此页面展示股票的基本信息,包括:
ID | 代码 | 名称 | 现价 | 成本价 | 收益 | 日期 | 操作 |
---|
对上述字段内容的分析:
ID: 这个应该可以通过数据库自动生成,只需展示出来即可;
代码: 手工添加到数据库的,界面上应该有入口,可以对要展示的股票代码进行增、删、改、查;
名称: 名称由于汉字较多,并且新浪股票的API接口是可以返回名称的,这里就不再要求用户输入了,直接通过接口获取并展示即可;
现价: 现价也是需要通过新浪股票的API接口获取的,不需要用户输入,现价应该是实时展示的,但是又怕刷新频率太快,所以最好是,进入该展示页面就刷新一次,然后从那之后,每5秒刷新一次,或用户手工刷新页面;
成本价: 需要用户手工添加到数据库,同“代码”一样,应可以CRUD;
收益: 现价减去成本价,得到每股收益,如果收益为正,则显示为红色,如果收益为负,则显示为绿色;
日期: 日期也是需要通过新浪股票的API接口获取,API接口是将日期和时间分开返回的,这里需要将两者合并后展示;
操作: 计划是在列表上方提供增加、查询功能,在操作栏里提供修改、删除功能;
至此,页面展示的大体内容和设计是完成了,由于书中采用的是bootstrap框架,这里我们也同样采用该框架,需要先简单学习一下,以便能实现上述功能。
- 原型
Axcure画这种原型大材小用了,还是画图直接来一个吧,原型设计如下:
- 数据库设计
字段名 | 类型 | 说明 |
---|---|---|
ID | int(11) | NOT NULL AUTO_INCREMENT, 主键 |
代码 | varchar(6) | DEFAULT NULL, 股票代码,eg:000001 |
名称 | varchar(255) | DEFAULT NULL,股票名称,eg:平安银行 |
现价 | decimal(10, 4) | DEFAULT NULL,eg:12.21 |
成本价 | decimal(10, 4) | DEFAULT NULL,eg:10.01 |
收益 | decimal(10, 4) | DEFAULT NULL,eg:2.20 |
日期 | datetime | DEFAULT NULL,最近一次刷新时间 |
后来想想不对,其实我们只需要在数据库里存储ID、代码和成本价,其余都是通过接口获取的,好吧,那我们试着去创建数据库和数据表。
首先,还是要修改settings.py,切换至MySQL数据库:
# Database
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT': '3306',
'NAME': 'stock',
'USER': 'root',
'PASSWORD': '*******',
}
}
然后在MySQL中创建stock数据库:
mysql> CREATE DATABASE stock CHARACTER SET utf8;
Query OK, 1 row affected (0.00 sec)
然后在执行Django数据库的初始和创建:
python manage.py makemigrations diff
python manage.py migrate