Django开发实践-1

来源:互联网 发布:51网络技术论坛 编辑:程序博客网 时间:2024/06/03 06:43

参考虫师的《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 urlfrom django.conf import settingsfrom django.contrib import adminfrom diff import viewsurlpatterns = [    url(r'^$', views.index),    url(r'^admin/', admin.site.urls),]
  • 登录页面-views.py
# /usr/bin python# -*- coding: utf-8 -*-from django.http import HttpResponsefrom 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 urlfrom django.conf.urls.static import staticfrom django.conf import settingsfrom django.contrib import adminfrom diff import viewsurlpatterns = [    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/#databasesDATABASES = {    '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