Python Django从安装到云平台攻略(三)前后端数据传输和对外数据接口

后台向前端页面传输数据

在html中用{{data1}} {{data2}}
在view中用:return render(request, ‘index.html’,{“data1”:dt01,“data2”:dt02})

from django.shortcuts import render
def main_page(request):
list = [‘view’, ‘Json’, ‘JS’]
return render(request, ‘index.html’, {
‘List’: json.dumps(list),
})----js----var List = {{ List|safe }};

前台向后台传数据

在html中

在view.py中 def acount(request): username = 0 usertel = 0 usercity = 0 useraddress = 0 if request.method == "POST": username = request.POST.get("uname",None) usertel = request.POST.get("utel",None) usercity = request.POST.get("ucity",None) useraddress = request.POST.get("uadr",None) print(username) print(usertel) print(usercity) print(useraddress) response = HttpResponseRedirect('/index/') return response return render(request, 'acount.html')

网络爬虫自动登录

from app01 import es_pachong

def es(request):
if request.method == “GET”:
es_pachong.espc()
print(“denglu”)
response = HttpResponseRedirect(‘http://cloud.izenery.com:8080/ideer/page/index.do’)
return response
return render(request, ‘es.html’)
########################################################################
from selenium import webdriver
def espc():
# 实例化出一个Firefox浏览器
driver = webdriver.Chrome()
driver.set_page_load_timeout(10)
driver.set_script_timeout(10)
# 设置浏览器窗口的位置和大小
driver.set_window_position(10, 10)
driver.set_window_size(200, 200)
# 打开一个页面(合天登录页)
try:
driver.get(“http://cloud.izenery.com:8080/ideer/”)
except:
print(“加载页面太慢,停止加载,继续下一步操作”)
driver.execute_script(“window.stop()”)
# 通过使用选择器选择元素进行模拟输入和点击按钮提交
driver.find_element_by_id(‘username’).clear()
driver.find_element_by_id(‘username’).send_keys(“15101092397”)
driver.find_element_by_id(‘pwd’).clear()
driver.find_element_by_id(‘pwd’).send_keys(“123456”)
driver.find_element_by_xpath(".//*[@class=‘col-lg-12’]/button").click()

测试数据的生成,类的建立

import numpy
import threading
import random
#Create your models here.
class login():
user01 = ((‘kdkj’,‘123456’),(1,1,1,0,0),(1,1,1,1,1,1,1,1,1))
user02 = ((‘shzf’, ‘shzf’), (1, 1, 0, 0, 0), (1, 1, 1, 0, 0, 0, 1, 0, 0)) ###eb\pd\ac\gl\pv\es\tf\dd
def str(self):
return self.ID
class data_static():
num_pro = 4
num_pd = 2
num_es = 1
num_pv = 1
num_ac = 1
num_gl = 0
def e_use(self):
e_u = random.randint(60, 80)
return e_u
def e_rate(self):
e_r = random.randint(0, 30)
return e_r
def alarm(self):
alm = random.randint(0, 10)
return alm
def alm_rate(self):
a_r = random.randint(-50, 50)
return a_r
def g_use(self):
g_u = random.randint(500, 800)
return g_u
def g_rate(self):
g_r = random.randint(-40, 40)
return g_r
def w_use(self):
w_u = random.randint(1000, 1500)
return w_u
def w_rate(self):
w_r = random.randint(-20, 20)
return w_r

获取系统日期和时间

import datetime
nowtime = datetime.datetime.now()
date_ic = int("%04d" % nowtime.year + “%02d” % nowtime.month + “%02d” % nowtime.day)
time_ic = int("%02d" % nowtime.hour + “%02d” % nowtime.minute + “%02d” % nowtime.second)

Django中程序中图片资源的路径问题(static文件夹的放置)

步骤1:在settings.py文件的最后加上以下内容:
STATIC_URL = ‘/static/’
STATIC_ROOT = os.path.join(os.path.dirname(file),‘static’)

设置图片等静态文件的路径

STATICFILES_DIRS = (
(‘css’,os.path.join(STATIC_ROOT,‘css’).replace(’\’,’/’) ),
(‘js’,os.path.join(STATIC_ROOT,‘js’).replace(’\’,’/’) ),
(‘pics’,os.path.join(STATIC_ROOT,‘pics’).replace(’\’,’/’) ),
(‘upload’,os.path.join(STATIC_ROOT,‘upload’).replace(’\’,’/’) ),
)

步骤2:在urls.py文件的开头第一行和第二行分别加上以下内容:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.contrib import staticfiles

在urls.py文件最后加上以下内容:
#设置静态文件路径
urlpatterns += staticfiles_urlpatterns()

步骤3:设置静态文件的目录,很关键

整个文件的目录结构如下
static 文件夹在app文件夹下面。(当然这对后面的大型应用来说不好,但是做为初学者已经够用了)

你的static和templates处于同级目录,然后将你的images,css,js文件夹放在static目录下面

测试:在你模板,也就是html文件中

改成自己的图片名称,注意图片前缀:/static/images/ 别写成 static/images/ 这样会无法显示.

通过传统的”?”传递参数
例如,http://127.0.0.1:8000/plist/?p1=china&p2=2012,url中‘?’之后表示传递的参数,这里传递了p1和p2两个参数。

通过这样的方式传递参数,就不会出现因为正则匹配错误而导致的问题了。在Django中,此类参数的解析是通过request.GET.get方法获取的。

配置URL及其视图如下:

(r’^plist/$’, helloParams1)

def helloParams(request):
p1 = request.GET.get(‘p1’)
p2 = request.GET.get(‘p2’)
return HttpResponse("p1 = " + p1 + "; p2 = " + p2)
输出结果为”p1 = china; p2 = 2012″

记录两种方法,实现只使用django(不用django-rest-framework等框架),编写返回json数据的接口。

方法1:
views.py:
def getAllUser(request):
# 手动编写api的方法,返回的response为json格式
queryset = models.Users.objects.all()
resList = []
for i in queryset:
resList += [{
‘userType’: i.userType,
‘userId’: i.userId,
}]
return JsonResponse(resList, safe=False)
方法2:
views.py:
def getAllUser(request):
# 手动编写api的方法,返回的response为json格式
queryset = models.Users.objects.all()
resList = []
for i in queryset:
resList += [{
‘userType’: i.userType,
‘userId’: i.userId,
}]
response = json.dumps(resList)
return HttpResponse(response, content_type=‘application/json’)


也就是说,方法1中的JsonReponse(…)等价于方法2中的最后两句

使用javascript实现图片的交替显示

<img src="/static/pics/pg1_1.jpg"  width="200" height="100"  name="u" id="u" style="width:100%; height:auto; FILTER: revealTrans(duration=2,transition=20)"  >
<script language="JavaScript">nextAD()</script>

使用ajax实现前后端数据传输

前端向后端传数
Html部分:

Python的view部分: from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def plate(request):
wc_rst = 0
es_rst = 0
if request.method == “POST”:
name_wc = request.POST.get(‘md_wc’)
name_es = request.POST.get(‘md_es’)
print(“wc name as:”, name_wc)
print(“es name as:”, name_es)
wc_rst = 1
es_rst = 1
return render(request, ‘plate.html’,{“wcr”:wc_rst, “esr”:es_rst})

三 JavaScript Ajax 动态刷新页面
这个标题的意思是:网页前台使用Ajax发送请求,后台处理数据后返回数据给前台,前台不刷新网页动态加载数据
Django 代码:
from django.http import HttpResponse,JsonResponse
def scene_update_view(request):
if request.method == “POST”:
name = request.POST.get(‘name’)
status = 0
result = “Error!”
response = JsonResponse({“status”: status,“result”: result})
return response
JS 代码:
function getSceneId(scece_name, td) {
var send_data = {
“name”: scece_name,
};

        $.ajax({
            type: "POST",
                url: "../project2/",
                data: send_data,                

success: function (data) {
##data = JSON.parse(data);##这句没用
alert(data[“status”]);
}
error: function() { }
});
}
JS 发送ajax请求,后台处理请求并返回status, result
在 success: 后面定义回调函数处理返回的数据,需要使用 JSON.parse(data)

生成pyc文件

在pycharm的terminal界面里,在manage.py文件路径下,执行:
python -m compileall


1.先将文件编译成pyc文件:但是文件都存在各个文件夹的__pycache__中
2.将__pycache__中的pyc文件拷贝到原来py存在的位置:python pyc_create copy 文件的根路径;这样就将编译的文件存在原来py文件的位置了
3.将原来的py文件删掉就可以了:python pyc_create remove 文件根路径
4.将文件的名字进行更改,我这里使用的是pyhon 3.6版本的,所以文件的名字变成了*.cpython-36.pyc,要将其中的cpython-36去掉,不然不能正常运行,因为文件的名字默认最后一个后缀是扩展名,其他的为文件名字
执行完毕,就可以使用了

Python调用API接口,并且解析JSON数据

测试用的API接口:
https://www.dmoe.wang/md0005m?uid=tht&ukey=123456&deviceid=8430&PWe=100&Rou=1&Fsp=35&Far=2&Pin=11&Pout=9
返回的JSON数据列表:
[{“error”: “None”, “powerout”: 137.20000000000002, “nengxiao”: 1.372}]
可见返回的JSON数据是一个字典数组

import urllib
import urllib.request
import json
import ssl
ssl._create_default_https_context = ssl._create_unverified_context ##屏蔽SSL验证,不然会报错

Whtml = urllib.request.urlopen(‘https://www.dmoe.wang/md0005m?uid=tht&ukey=123456&deviceid=8430&PWe=100&Rou=1&Fsp=35&Far=2&Pin=11&Pout=9’)
Wcont = Whtml.read()
print(“shuju:”, Wcont) ##显示所有的JSON返回数据
Wjson = json.loads(Wcont)
print(“powerout:”, Wjson[0][“powerout”]) ##提取出第一个字典中的“powerout”数据项的数值

Python通过post向外部URL请求数据

post_url = “http://110.53.163.220:10103/data/device/searchLoad-emes.jspx”
post_data = {
“page”: “1”,
“s d a t e date datege d a t e " : " 2020 − 07 − 1810 : 22 : 09 " , " s date": "2020-07-18 10:22:09", "s date":"2020071810:22:09","sdate l e le ledate”: “2020-08-20 10:22:09”,
“meter”: “4”,
“authCode”: “ea970057ff52de917e225e823c2adadfa6ad20760fad782cadd6c9d5a7782276”,
}

resp = requests.post(url=post_url, data=post_data)

content = resp.json()
print(content)

Python定时任务让数据接口保持运行

from apscheduler.scheduler import Scheduler
##定时任务
sched = Scheduler() #实例化,固定格式
@sched.interval_schedule(seconds=5)
def mytask1():
meter_1d_data_get()

@sched.interval_schedule(seconds=10)
def mytask2():
meter_15m_data_get()

sched.start() # 启动该脚本

利用for循环遍历数组的元素

abc = [11,22,33,44]
for index, element in enumerate(abc):
index = 1,2,3,4##
element = 11,22,33,44##

django models用related_name实现一个模型中多个外键指向同一个属性

related_name相当于我们使用related代替了在通过一个对象查询出多个对象集合时,使用表名_set来获取
class LVBC_tag(models.Model): ## Low voltage bus coupler
ID = models.AutoField(primary_key=True)
LVbus1_id = models.ForeignKey(to=“LVbus_tag”, to_field=“ID”, on_delete=models.CASCADE, related_name=‘LVbus1_id’)
LVbus2_id = models.ForeignKey(to=“LVbus_tag”, to_field=“ID”, on_delete=models.CASCADE, related_name=‘LVbus2_id’)
LVBC_serial_num = models.IntegerField(50)
LVBC_pdct_time = models.IntegerField(20)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python Django 疫情数据平台设计可以从以下几个方面进行考虑: 1. 数据采集与处理:利用 Python 进行数据的采集和处理,可以使用爬虫技术从各个官方网站或数据源上获取疫情相关数据,然后通过数据处理清洗,提取出所需的有效信息。 2. 数据存储与管理:使用 Django ORM(对象关系映射)技术,将清洗好的数据存储到数据库中。可以选择使用关系型数据库如 MySQL 或 PostgreSQL,也可以考虑使用非关系型数据库如 MongoDB。 3. 用户身份验证与权限控制:在 Django 中提供了用户认证和权限控制的功能,可以通过设置登录注册系统来管理用户的访问权限,只允许具备特定权限的用户查看或修改相关数据。 4. 数据可视化与分析:使用可视化库如 Matplotlib、Seaborn 或 Plotly,对疫情数据进行可视化展示,例如绘制曲线图、地图等,方便用户直观地了解疫情发展趋势。 5. 接口开发与数据交互:通过 Django REST framework 构建 API 接口,可以提供给其他系统或移动端应用获取疫情数据,也可以与其他数据源进行数据交互,实现数据的共享和更新。 6. 后台管理与数据维护:利用 Django 提供的后台管理界面,可以方便地管理数据,包括数据的录入、修改、删除等操作。同时,可以定期对数据进行维护,例如数据清洗、备份等,确保数据的完整性和准确性。 总结:通过 Python Django 可以快速高效地开发疫情数据平台,从数据采集、存储、管理到可视化分析和接口开发都有较为成熟的解决方案。这种设计能够满足用户对疫情数据的查看和分析需求,同时提供了数据可视化和数据交互的功能,使得用户能够方便灵活地获取和利用疫情数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tsatnt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值