开发工具:pycharm
环境:python3.7.4(例子中用的3.6)
下载安装pycharm:http://www.jetbrains.com/pycharm/download/#section=windows
分为社区版和专业版,一个免费一个收费
社区版网盘:https://pan.baidu.com/s/19ZfEupsFXt10Wy9DlYuh2w
提取码: yfmt
下载安装python:https://www.python.org/downloads/windows/
安装好开发工具和python环境后,打开pycharm,配置python环境以及升级pip,由于低版本pip影响新版本组件的安装因此建议升级到最新版本的pip。
配置好python环境后
安装中的状态
安装成功提示如下
成功后等待一会工具处理插件,处理成功后就可以用新版本的pip了
同样的方法安装django,pymysql
需要注意的是,各个插件版本的依赖关系,安装你的python版本支持的django和pymysql
#创建一个项目,名称为blogs
django-admin.exe startproject blogs
#进入项目目录
cd blogs
#创建一个应用,注应用名称不能与项目名称相同
python manage.py startapp blog
Pycharm 设置路径
两个都勾选上,然后右键目录,加入目录的路径,引用模块的时候就不会报错
项目创建好后,目录结构如下
from django.contrib import admin
from django.urls import path
from blog.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('', indexes),
path('blog/', index),
path('start/', start_scrapy),
]
2.Settings.py中添加应用配置
import pymysql #引用mysql驱动
pymysql.install_as_MySQLdb()
ALLOWED_HOSTS = ["*"]#允许全部主机访问
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',#添加创建的应用模块
'bootstrap3',#如果需要使用bootstrap框架,需要安装django-bootstrap3插件
]
DATABASES = {#配置数据库链接属性
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
'default': {
'ENGINE': 'django.db.backends.mysql', # 或者使用 mysql.connector.django
'NAME': 'blog',
'USER': 'root',
'PASSWORD': '@bjive321',
'HOST': '59.110.138.8',
'PORT': '3306',
}
}
from django.db import models
# Create your models here.
class Blog(models.Model):
title = models.CharField(u'标题', max_length=64)
content = models.TextField(u'内容', default="")
update_time = models.DateTimeField(u'更新时间', auto_now=True)
pub_date = models.DateField(u'发布时间')
author = models.CharField(u'作者', max_length=64, default=None)
# update_time.editable = True
# 列表中显示的内容
def __str__(self):
return "标题:{},字数:{},概要:{}".format(self.title, len(self.content), self.content[:18])
class Spider(models.Model):
#自定义主键
# id = models.CharField(primary_key=True)
date = models.DateField(u'日期')
open = models.DecimalField(u'开盘价', max_digits=8, decimal_places=2)
close = models.DecimalField(u'收盘价', max_digits=8, decimal_places=2)
height = models.DecimalField(u'最高价', max_digits=8, decimal_places=2)
low = models.DecimalField(u'最低价', max_digits=8, decimal_places=2)
updownd = models.DecimalField(u'涨跌幅度', max_digits=8, decimal_places=2)
turnrate = models.DecimalField(u'换手率', max_digits=8, decimal_places=2)
count = models.DecimalField(u'总价', max_digits=8, decimal_places=2)
4.配置admin.py后台管理功能扩展,将开发的模块注册到admin后台管理中,可以自动赋予增删改查能力。
我增加了两个功能,一个博客管理,一个爬虫管理(对爬取的内容进行修改查看删除等操作)
from django.contrib import admin
from blog.models import Blog, Spider
class ContactAdmin(admin.ModelAdmin):
# 增加内容时,将登陆人的账号存入指定的字段中,models中要预留这个字段,这里是author
def save_model(self, request, obj, form, change):
if change: # 更新操作返回true
obj.save()
else: # 否则是新增
obj.author = request.user
obj.save()
# 设置作者字段只读
readonly_fields = ("author",)
# 过滤,只能查看操作登陆人自己创建的内容
def get_queryset(self, request):
qs = super(ContactAdmin, self).get_queryset(request)
if request.user.is_superuser:
return qs
return qs.filter(author=request.user)
# listdisplay设置要显示在列表中的字段(id字段是Django模型的默认主键)
list_display = ('title', 'update_time', 'pub_date', 'author') # list
search_fields = ('title', 'content',) # 如果只有一个值,结尾必须有一个逗号,证明是list或元组
# list_per_page设置每页显示多少条记录,默认是100条
list_per_page = 5
# ordering设置默认排序字段,负号表示降序排序
ordering = ('-update_time',)
# list_editable 设置默认可编辑字段,第一个字段不允许编辑
list_editable = ['pub_date', ]
# fk_fields 设置显示外键字段
# fk_fields = ('machine_room_id',)
date_hierarchy = 'pub_date'
class SpiderAdmin(admin.ModelAdmin):
list_display = ('date', 'open', 'close', 'height', 'low', 'updownd', 'turnrate', 'count') # list
date_hierarchy = 'date'
# list_per_page设置每页显示多少条记录,默认是100条
list_per_page = 20
# Register your models here.
admin.site.register(Blog, ContactAdmin)
admin.site.register(Spider, SpiderAdmin)
# 设置登陆窗口的标题
admin.site.site_header = '屌炸天系统'
# 设置页签标题
admin.site.site_title = '牛逼轰轰'
4.初始化admin以及创建blog和spider表
$ python manage.py migrate # 创建表结构,默认创建admin模块表
$ python manage.py makemigrations blog # 让 Django 知道我们在我们的模型有一些变更
$ python manage.py migrate blog # 创建自定义表结构
$ python manage.py createsuperuser #创建后台管理员账号
5.编写views.py
import base64
from io import BytesIO
import requests
from django.http import JsonResponse
from django.shortcuts import render
import markdown
# Create your views here.
import blog.models as m
import pandas as pd
import matplotlib
from matplotlib import pyplot as plt
# 查询
# models.UserInfo.objects.all()
# models.UserInfo.objects.all().values('user') #只取user列
# models.UserInfo.objects.all().values_list('id','user') #取出id和user列,并生成一个列表
# models.UserInfo.objects.get(id=1)
# models.UserInfo.objects.get(user='yangmv')
# 增
# models.UserInfo.objects.create(user='yangmv',pwd='123456')
# 或者
# obj = models.UserInfo(user='yangmv',pwd='123456')
# obj.save()
# 或者
# dic = {'user':'yangmv','pwd':'123456'}
# models.UserInfo.objects.create(**dic)
# 删
# models.UserInfo.objects.filter(id=1).delete()
# 改
# models.UserInfo.objects.filter(user='yangmv').update(pwd='520')
# 或者
# obj = models.UserInfo.objects.get(user='yangmv')
# obj.pwd = '520'
# obj.save()
def index(request):
i = request.GET.get('id')
# postdata = request.POST['id']
blog = m.Blog.objects.get(id=i)
blog_content = markdown.markdown(blog.content)
spider = m.Spider.objects.all().values()
plot_data = showMatplot(pd.DataFrame(spider))
imb = base64.b64encode(plot_data) # 对plot_data进行编码
ims = imb.decode()
imd = "data:image/png;base64," + ims
return render(request, "blog.html", {'blog': blog, 'blog_content': blog_content, 'img': imd})
def indexes(request):
blogs = m.Blog.objects.all()
return render(request, "blogs.html", {'blogs': blogs})
#图标嵌入django页面
def showMatplot(df):
plt.figure(figsize=(12, 10)) # 设置图像大小
plt.subplot(212) # 布局两行1列的第二个
col = ['date', 'open', 'close', 'height', 'low', 'updownd', 'count']
df = df.astype(
{'open': 'float', 'close': 'float', 'height': 'float', 'low': 'float', 'updownd': 'float', 'count': 'float'})
df = pd.DataFrame(df, columns=col)
# print(df)
# print("*" * 40)
# # corr只能对数值型数据进行相关度计算
# print(df.corr())
x = pd.to_datetime(df['date'])
y1 = df["open"]
y2 = df["close"]
y3 = df["height"]
y4 = df["low"]
plt.plot(x, y1, label='open', linestyle='-', c='black', linewidth=1)
plt.plot(x, y2, label='close', linestyle='--', c='r', linewidth=1)
plt.plot(x, y3, label='height', linestyle=':', c='g', linewidth=1)
plt.plot(x, y4, label='low', linestyle='-.', c='b', linewidth=1)
plt.legend()
plt.subplot(211) # 布局两行一列第一个
df1 = df.sort_values(by='date', ascending=True)
# df1 = df1.iloc[30:]
col = ["date", "close"]
close = pd.DataFrame(df1, columns=col)
data = cal_macd_system(close, 12, 26, 9)
x = pd.to_datetime(data['date'])
# y = pd.to_numeric(data["close"])
y1 = data["macd"]
# plt.plot(x, y, label="k")
plt.plot(x, y1, label="macd")
plt.title("某公司股票", fontproperties=zhfont1, fontsize=15)
plt.legend()
buffer = BytesIO()
plt.savefig(buffer)
plot_data = buffer.getvalue()
return plot_data
#下载字体放到项目目录中,解决图标中文显示
zhfont1 = matplotlib.font_manager.FontProperties(fname="FZSTK.TTF")
#macd指标算法
def cal_macd_system(data, short_, long_, m):
'''
data是包含高开低收成交量的标准dataframe
short_,long_,m分别是macd的三个参数
返回值是包含原始数据和diff,dea,macd三个列的dataframe
'''
data['diff'] = data['close'].ewm(adjust=False, alpha=2 / (short_ + 1), ignore_na=True).mean() - \
data['close'].ewm(adjust=False, alpha=2 / (long_ + 1), ignore_na=True).mean()
data['dea'] = data['diff'].ewm(adjust=False, alpha=2 / (m + 1), ignore_na=True).mean()
data['macd'] = 2 * (data['diff'] - data['dea'])
return data
#绘制macd指标曲线
def macdview(df):
df1 = df.sort_values(by='date', ascending=True)
# df1 = df1.iloc[30:]
col = ["date", "close"]
close = pd.DataFrame(df1, columns=col)
data = cal_macd_system(close, 12, 26, 9)
x = pd.to_datetime(data['date'])
# y = pd.to_numeric(data["close"])
y1 = data["macd"]
# plt.plot(x, y, label="k")
plt.plot(x, y1, label="macd")
plt.title("某公司股票", fontproperties=zhfont1, fontsize=15)
# plt.legend()
buffer = BytesIO()
buffer.flush()
plt.savefig(buffer)
plot_data = buffer.getvalue()
buffer.close()
return plot_data
#在线启动爬虫
def start_scrapy(request):
# 获取页面传参,要区分请求类型是POST还是GET,不同请求用不同的方法接收参数
year = request.POST.get('year')
jd = request.POST.get('jd')
url = 'http://127.0.0.1:6800/schedule.json'
# spider是执行scrapy list返回的名称,参数问题:除了内置key的参数外如project,spider等,其他参数均由爬虫初始化函数的kwargs接收
# 同时jobid也有kwargs接收,**kwargs是接收字典型的参数,带有key值的
data = {'project': 'pachong', 'spider': 'pachong_spider', 'year': year, 'jd': jd}
print(requests.post(url=url, data=data))
return JsonResponse({'result': 'ok'})
在创建的应用下,创建2个文件夹,分别为static和templates,名字必须为这个,static是放静态资源css,js,img等,templates存放模板页面文件html等
如果想自定义路径需要在settings.py配置你的路径到环境中(具体配置请百度)
5.在终端中运行服务:
$python manage.py runserver 8080(不指定端口号的话默认8000)
以上就是我第一个入门级django项目的开发过程,以此记录,激励后期学习!后面会整理爬虫学习的代码也一并记录下来。
项目源代码:https://download.csdn.net/download/kimheesunliulu/11750758