python+django+mysql開發(fā)實(shí)戰(zhàn)(附demo)
開發(fā)工具:pycharm
環(huán)境:python3.7.4(例子中用的3.6)
下載安裝pycharm:http://www.jetbrains.com/pycharm/download/#section=windows
分為社區(qū)版和專業(yè)版,一個(gè)免費(fèi)一個(gè)收費(fèi)
Pycharm2021破解版下載: http://www.dhdzp.com/softs/598504.html
下載安裝python:https://www.python.org/downloads/windows/
安裝好開發(fā)工具和python環(huán)境后,打開pycharm,配置python環(huán)境以及升級(jí)pip,由于低版本pip影響新版本組件的安裝因此建議升級(jí)到最新版本的pip。
一、安裝配置環(huán)境


配置好python環(huán)境后



安裝中的狀態(tài)

安裝成功提示如下

成功后等待一會(huì)工具處理插件,處理成功后就可以用新版本的pip了

同樣的方法安裝django,pymysql
需要注意的是,各個(gè)插件版本的依賴關(guān)系,安裝你的python版本支持的django和pymysql
二、創(chuàng)建django項(xiàng)目
右鍵你的項(xiàng)目,打開終端


輸入如下內(nèi)容
#創(chuàng)建一個(gè)項(xiàng)目,名稱為blogs django-admin.exe startproject blogs #進(jìn)入項(xiàng)目目錄 cd blogs #創(chuàng)建一個(gè)應(yīng)用,注應(yīng)用名稱不能與項(xiàng)目名稱相同 python manage.py startapp blog
Pycharm 設(shè)置路徑

兩個(gè)都勾選上,然后右鍵目錄,加入目錄的路徑,引用模塊的時(shí)候就不會(huì)報(bào)錯(cuò)

項(xiàng)目創(chuàng)建好后,目錄結(jié)構(gòu)如下

三、開發(fā)
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中添加應(yīng)用配置
import pymysql #引用mysql驅(qū)動(dòng)
pymysql.install_as_MySQLdb()
ALLOWED_HOSTS = ["*"]#允許全部主機(jī)訪問
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',#添加創(chuàng)建的應(yīng)用模塊
'bootstrap3',#如果需要使用bootstrap框架,需要安裝django-bootstrap3插件
]
DATABASES = {#配置數(shù)據(jù)庫(kù)鏈接屬性
# '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'標(biāo)題', max_length=64)
content = models.TextField(u'內(nèi)容', default="")
update_time = models.DateTimeField(u'更新時(shí)間', auto_now=True)
pub_date = models.DateField(u'發(fā)布時(shí)間')
author = models.CharField(u'作者', max_length=64, default=None)
# update_time.editable = True
# 列表中顯示的內(nèi)容
def __str__(self):
return "標(biāo)題:{},字?jǐn)?shù):{},概要:{}".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'開盤價(jià)', max_digits=8, decimal_places=2)
close = models.DecimalField(u'收盤價(jià)', max_digits=8, decimal_places=2)
height = models.DecimalField(u'最高價(jià)', max_digits=8, decimal_places=2)
low = models.DecimalField(u'最低價(jià)', 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'總價(jià)', max_digits=8, decimal_places=2)
4.配置admin.py后臺(tái)管理功能擴(kuò)展,將開發(fā)的模塊注冊(cè)到admin后臺(tái)管理中,可以自動(dòng)賦予增刪改查能力。

我增加了兩個(gè)功能,一個(gè)博客管理,一個(gè)爬蟲管理(對(duì)爬取的內(nèi)容進(jìn)行修改查看刪除等操作)
from django.contrib import admin
from blog.models import Blog, Spider
class ContactAdmin(admin.ModelAdmin):
# 增加內(nèi)容時(shí),將登陸人的賬號(hào)存入指定的字段中,models中要預(yù)留這個(gè)字段,這里是author
def save_model(self, request, obj, form, change):
if change: # 更新操作返回true
obj.save()
else: # 否則是新增
obj.author = request.user
obj.save()
# 設(shè)置作者字段只讀
readonly_fields = ("author",)
# 過濾,只能查看操作登陸人自己創(chuàng)建的內(nèi)容
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設(shè)置要顯示在列表中的字段(id字段是Django模型的默認(rèn)主鍵)
list_display = ('title', 'update_time', 'pub_date', 'author') # list
search_fields = ('title', 'content',) # 如果只有一個(gè)值,結(jié)尾必須有一個(gè)逗號(hào),證明是list或元組
# list_per_page設(shè)置每頁(yè)顯示多少條記錄,默認(rèn)是100條
list_per_page = 5
# ordering設(shè)置默認(rèn)排序字段,負(fù)號(hào)表示降序排序
ordering = ('-update_time',)
# list_editable 設(shè)置默認(rèn)可編輯字段,第一個(gè)字段不允許編輯
list_editable = ['pub_date', ]
# fk_fields 設(shè)置顯示外鍵字段
# 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設(shè)置每頁(yè)顯示多少條記錄,默認(rèn)是100條
list_per_page = 20
# Register your models here.
admin.site.register(Blog, ContactAdmin)
admin.site.register(Spider, SpiderAdmin)
# 設(shè)置登陸窗口的標(biāo)題
admin.site.site_header = '屌炸天系統(tǒng)'
# 設(shè)置頁(yè)簽標(biāo)題
admin.site.site_title = '牛逼轟轟'
4.初始化admin以及創(chuàng)建blog和spider表
$ python manage.py migrate # 創(chuàng)建表結(jié)構(gòu),默認(rèn)創(chuàng)建admin模塊表 $ python manage.py makemigrations blog # 讓 Django 知道我們?cè)谖覀兊哪P陀幸恍┳兏? $ python manage.py migrate blog # 創(chuàng)建自定義表結(jié)構(gòu) $ python manage.py createsuperuser #創(chuàng)建后臺(tái)管理員賬號(hào)
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列,并生成一個(gè)列表
# 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) # 對(duì)plot_data進(jìn)行編碼
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})
#圖標(biāo)嵌入django頁(yè)面
def showMatplot(df):
plt.figure(figsize=(12, 10)) # 設(shè)置圖像大小
plt.subplot(212) # 布局兩行1列的第二個(gè)
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只能對(duì)數(shù)值型數(shù)據(jù)進(jìn)行相關(guān)度計(jì)算
# 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) # 布局兩行一列第一個(gè)
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
#下載字體放到項(xiàng)目目錄中,解決圖標(biāo)中文顯示
zhfont1 = matplotlib.font_manager.FontProperties(fname="FZSTK.TTF")
#macd指標(biāo)算法
def cal_macd_system(data, short_, long_, m):
'''
data是包含高開低收成交量的標(biāo)準(zhǔn)dataframe
short_,long_,m分別是macd的三個(gè)參數(shù)
返回值是包含原始數(shù)據(jù)和diff,dea,macd三個(gè)列的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指標(biāo)曲線
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
#在線啟動(dòng)爬蟲
def start_scrapy(request):
# 獲取頁(yè)面?zhèn)鲄ⅲ獏^(qū)分請(qǐng)求類型是POST還是GET,不同請(qǐng)求用不同的方法接收參數(shù)
year = request.POST.get('year')
jd = request.POST.get('jd')
url = 'http://127.0.0.1:6800/schedule.json'
# spider是執(zhí)行scrapy list返回的名稱,參數(shù)問題:除了內(nèi)置key的參數(shù)外如project,spider等,其他參數(shù)均由爬蟲初始化函數(shù)的kwargs接收
# 同時(shí)jobid也有kwargs接收,**kwargs是接收字典型的參數(shù),帶有key值的
data = {'project': 'pachong', 'spider': 'pachong_spider', 'year': year, 'jd': jd}
print(requests.post(url=url, data=data))
return JsonResponse({'result': 'ok'})
在創(chuàng)建的應(yīng)用下,創(chuàng)建2個(gè)文件夾,分別為static和templates,名字必須為這個(gè),static是放靜態(tài)資源css,js,img等,templates存放模板頁(yè)面文件html等
如果想自定義路徑需要在settings.py配置你的路徑到環(huán)境中(具體配置請(qǐng)百度)


5.在終端中運(yùn)行服務(wù):
$python manage.py runserver 8080(不指定端口號(hào)的話默認(rèn)8000)
以上就是我第一個(gè)入門級(jí)django項(xiàng)目的開發(fā)過程,以此記錄,激勵(lì)后期學(xué)習(xí)!后面會(huì)整理爬蟲學(xué)習(xí)的代碼也一并記錄下來。
項(xiàng)目源代碼:pystudy_jb51.rar
到此這篇關(guān)于python+django+mysql開發(fā)實(shí)戰(zhàn)(附demo)的文章就介紹到這了,更多相關(guān)python django mysql開發(fā)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 教你用Python3+mysql8.0搭建Django框架
- Python+Django+MySQL實(shí)現(xiàn)基于Web版的增刪改查的示例代碼
- python+Django+pycharm+mysql 搭建首個(gè)web項(xiàng)目詳解
- Pycharm+django2.2+python3.6+MySQL實(shí)現(xiàn)簡(jiǎn)單的考試報(bào)名系統(tǒng)
- python3.6+django2.0+mysql搭建網(wǎng)站過程詳解
- 在python3環(huán)境下的Django中使用MySQL數(shù)據(jù)庫(kù)的實(shí)例
- python django 增刪改查操作 數(shù)據(jù)庫(kù)Mysql
- Django1.7+python 2.78+pycharm配置mysql數(shù)據(jù)庫(kù)教程
相關(guān)文章
Python?異步如何使用等待有時(shí)間限制協(xié)程
這篇文章主要為大家介紹了Python?異步如何使用等待有時(shí)間限制協(xié)程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
python網(wǎng)絡(luò)編程學(xué)習(xí)筆記(四):域名系統(tǒng)
當(dāng)我們?cè)谏暇W(wǎng)的時(shí)候,通常輸入的是網(wǎng)址,其實(shí)這就是一個(gè)域名,而我們計(jì)算機(jī)網(wǎng)絡(luò)上的計(jì)算機(jī)彼此之間只能用IP地址才能相互識(shí)別2014-06-06
python文件操作相關(guān)知識(shí)點(diǎn)總結(jié)整理
這篇文章主要介紹了python文件操作相關(guān)知識(shí)點(diǎn),整理匯總了Python文件操作所涉及的常見函數(shù)與方法,并給出了實(shí)例代碼予以總結(jié)歸納,需要的朋友可以參考下2016-02-02
Python Selenium網(wǎng)頁(yè)自動(dòng)化利器使用詳解
這篇文章主要為大家介紹了使用Python Selenium實(shí)現(xiàn)網(wǎng)頁(yè)自動(dòng)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
python實(shí)現(xiàn)各進(jìn)制轉(zhuǎn)換的總結(jié)大全
這篇文章主要給大家總結(jié)了python實(shí)現(xiàn)各進(jìn)制轉(zhuǎn)換的相關(guān)資料,其中包括字符串與十六進(jìn)制轉(zhuǎn)換、內(nèi)置函數(shù)hex()與進(jìn)制互轉(zhuǎn)等相關(guān)內(nèi)容,需要的朋友可以參考借鑒,下面來一起看看吧。2017-06-06
python計(jì)算機(jī)視覺OpenCV庫(kù)實(shí)現(xiàn)實(shí)時(shí)攝像頭人臉檢測(cè)示例
這篇文章主要為大家介紹了python使用OpenCV實(shí)現(xiàn)實(shí)時(shí)攝像頭人臉檢測(cè)的示例過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10
python如何實(shí)現(xiàn)lazy segment tree惰性段樹算法
LazySegmentTree(惰性段樹)算法是一種數(shù)據(jù)結(jié)構(gòu),專門用于高效處理區(qū)間查詢和更新操作,它利用延遲更新技術(shù)(LazyPropagation),僅在必要時(shí)執(zhí)行實(shí)際更新,以提升效率,此結(jié)構(gòu)將數(shù)組表達(dá)為二叉樹,每個(gè)節(jié)點(diǎn)表示一個(gè)數(shù)組區(qū)間2024-10-10

