python+django+mysql开发实战(附demo)
开发工具:pycharm
环境:python3.7.4(例子中用的3.6)
下载安装pycharm:http://www.jetbrains.com/pycharm/download/#section=windows
分为社区版和专业版,一个免费一个收费
pycharm2021破解版下载:
下载安装python:https://www.python.org/downloads/windows/
安装好开发工具和python环境后,打开pycharm,配置python环境以及升级pip,由于低版本pip影响新版本组件的安装因此建议升级到最新版本的pip。
一、安装配置环境
配置好python环境后
安装中的状态
安装成功提示如下
成功后等待一会工具处理插件,处理成功后就可以用新版本的pip了
同样的方法安装django,pymysql
需要注意的是,各个插件版本的依赖关系,安装你的python版本支持的django和pymysql
二、创建django项目
右键你的项目,打开终端
输入如下内容
#创建一个项目,名称为blogs django-admin.exe startproject blogs #进入项目目录 cd blogs #创建一个应用,注应用名称不能与项目名称相同 python manage.py startapp blog
pycharm 设置路径
两个都勾选上,然后右键目录,加入目录的路径,引用模块的时候就不会报错
项目创建好后,目录结构如下
三、开发
1.添加url路由
在urls.py文件中,编写如下代码:
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', } }
3.编写models
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项目的开发过程,以此记录,激励后期学习!后面会整理爬虫学习的代码也一并记录下来。
项目源代码:
到此这篇关于python+django+mysql开发实战(附demo)的文章就介绍到这了,更多相关python django mysql开发内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
推荐阅读
-
Android开发之自定义view实现通讯录列表A~Z字母提示效果【附demo源码下载】
-
Android开发之HttpClient异步请求数据的方法详解【附demo源码下载】
-
Android开发实现的简单计算器功能【附完整demo源码下载】
-
REST风格框架实战:从MVC到前后端分离(附完整Demo)
-
python+django+mysql开发实战(附demo)
-
Android开发之自定义view实现通讯录列表A~Z字母提示效果【附demo源码下载】
-
Android UI开发利器-DataBinding(附Demo)
-
REST风格框架实战:从MVC到前后端分离(附完整Demo)
-
利用@angular/cli V6.0开发PWA应用实战案例详解(附代码)
-
Android开发实现的简单计算器功能【附完整demo源码下载】