[雪峰磁针石博客]flask构建自动化测试平台7-添加google地图

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 本章将介绍以下主题: mock数据库 创建犯罪地图 本文最新版本 代码地址 mock数据库 mockdbhelper.py class MockDBHelper: def connect(self, database="crimemap"): pass def.

本章将介绍以下主题:

  • mock数据库
  • 创建犯罪地图

本文最新版本
代码地址

mock数据库

mockdbhelper.py


class MockDBHelper:

    def connect(self, database="crimemap"):
        pass

    def add_crime(self, category, date, latitude, longitude, description):
        data = [category, date, latitude, longitude, description]
        for i in data:
            print (i, type(i))

    def get_all_crimes(self):
        return [{'latitude': -33.301304,
                 'longitude': 26.523355,
                 'date': "2000-01-01",
                 'category': "mugging",
                 'description': "mock description"}]

    def add_input(self, data):
        pass

    def clear_all(self):
        pass

db_setup.py


import pymysql
import dbconfig
connection = pymysql.connect(host='localhost',
                             user=dbconfig.db_user,
                             passwd=dbconfig.db_password)

try:
    with connection.cursor() as cursor:
        sql = "CREATE DATABASE IF NOT EXISTS crimemap"
        cursor.execute(sql)
        sql = """CREATE TABLE IF NOT EXISTS crimemap.crimes (
id int NOT NULL AUTO_INCREMENT,
latitude FLOAT(10,6),
longitude FLOAT(10,6),
date DATETIME,
category VARCHAR(50),
description VARCHAR(255),
updated_at TIMESTAMP,
PRIMARY KEY (id)
)"""
        cursor.execute(sql)
    connection.commit()
finally:
    connection.close()

crimemap.py


from flask import Flask
from flask import render_template
from flask import request
import json
import dbconfig
if dbconfig.test:
    from mockdbhelper import MockDBHelper as DBHelper
else:
    from dbhelper import DBHelper

app = Flask(__name__)
DB = DBHelper()


@app.route("/")
def home():
    crimes = DB.get_all_crimes()
    crimes = json.dumps(crimes)
    return render_template("home.html", crimes=crimes)


@app.route("/submitcrime", methods=['POST'])
def submitcrime():
    category = request.form.get("category")
    date = request.form.get("date")
    latitude = float(request.form.get("latitude"))
    longitude = float(request.form.get("longitude"))
    description = request.form.get("description")
    DB.add_crime(category, date, latitude, longitude, description)
    return home()


if __name__ == '__main__':
    app.run(host='0.0.0.0',port=8000, debug=True)

dbconfig.py


test = True

dbhelper.py


import pymysql
import dbconfig


class DBHelper:

    def connect(self, database="crimemap"):
        return pymysql.connect(host='localhost',
                               user=dbconfig.db_user,
                               passwd=dbconfig.db_password,
                               db=database)

    def get_all_inputs(self):
        connection = self.connect()
        try:
            query = "SELECT description FROM crimes;"
            with connection.cursor() as cursor:
                cursor.execute(query)
            return cursor.fetchall()
        finally:
            connection.close()

    def add_input(self, data):
        connection = self.connect()
        try:
            query = "INSERT INTO crimes (description) VALUES (%s);"
            with connection.cursor() as cursor:
                cursor.execute(query, data)
                connection.commit()
        finally:
            connection.close()

    def clear_all(self):
        connection = self.connect()
        try:
            query = "DELETE FROM crimes;"
            with connection.cursor() as cursor:
                cursor.execute(query)
                connection.commit()
        finally:
            connection.close()

home.html


<!DOCTYPE html>
<html lang="en">
  <head>

  <link type="text/css" rel="stylesheet" href="{{url_for('static', filename='css/style.css') }}" /> 

  <script type="text/javascript"
    src="https://maps.googleapis.com/maps/api/js">
  </script> 

  <script type="text/javascript">
    var map;
    var marker;
    var existing_crimes;

    function initialize() { 
      var mapOptions = {
        center: new google.maps.LatLng(-33.30578381949298, 26.523442268371582),
        zoom: 15
      };
      map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);
      google.maps.event.addListener(map, 'click', function(event){   
        placeMarker(event.latLng);
      });
      placeCrimes({{crimes | safe}});
    }

    function placeCrimes(crimes) {
      for (i=0; i<crimes.length; i++) {
        crime = new google.maps.Marker( {
          position: new google.maps.LatLng(crimes[i].latitude, crimes[i].longitude),
          map: map,
          title: crimes[i].date + "\n" + 
            crimes[i].category + "\n" + crimes[i].description
          }
        );
      }
    }

    function placeMarker(location) {
      if (marker) {
        marker.setPosition(location);
      } else {
        marker = new google.maps.Marker({
          position: location, 
          map: map
        });
      }
    document.getElementById('latitude').value = location.lat();
    document.getElementById('longitude').value = location.lng();
    }
  </script>
  
</head>
  <body onload="initialize()">
      <h1>CrimeMap</h1>
      <p>A map of recent criminal activity in the Grahamstown area.</p>
      <div id="map-canvas"></div>

      <div id="newcrimeform">
        <h2>Submit new crime</h2>
        <form action="/submitcrime" method="POST">
        <label for="category">Category</label> 
        <select name="category" id="category">
            <option value="mugging">Mugging</option>
            <option value="breakin">Break-in</option>
        </select> 
        </select> 
        <label for="date">Date</label>
        <input name="date" id="date" type="date">
        <label for="latitude">Latitude</label>
        <input name="latitude" id="latitude" type="text">
        <label for="longitude">Longitude</label>
        <input name="longitude" id="longitude" type="text">
        <label for="description">Description</label>
        <textarea name="description" id="description" placeholder="A brief but detailed description of the crime"></textarea>
        <input type="submit" value="Submit">
      </form>
    </div>
  </body>
</html>

style.css


body { 
    font-family: sans-serif; 
    background: #eee; 
}

#map-canvas {
    width: 70%;
    height: 500px;
    float: left;
}

#newcrimeform {
    float: right;
    width: 25%;
}

input, select, textarea { 
    display: block;
    color: grey;
    border: 1px solid lightsteelblue;
    line-height: 15px;
    margin: 2px 6px 16px 0px;
    width: 100%;
}

input[type="submit"] {
    padding: 5px 10px 5px 10px;
    color: black;
    background: lightsteelblue;
    border: none;
    box-shadow: 1px 1px 1px #4C6E91;
}

input[type="submit"]:hover {
    background: steelblue;
}

image.png

参考资料

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
监控 jenkins 测试技术
自动化测试框架的构建与实践
【10月更文挑战第40天】在软件开发周期中,测试环节扮演着至关重要的角色。本文将引导你了解如何构建一个高效的自动化测试框架,并深入探讨其设计原则、实现方法及维护策略。通过实际代码示例和清晰的步骤说明,我们将一起探索如何确保软件质量,同时提升开发效率。
62 1
|
2月前
|
测试技术 开发者 Python
自动化测试之美:从零构建你的软件质量防线
【10月更文挑战第34天】在数字化时代的浪潮中,软件成为我们生活和工作不可或缺的一部分。然而,随着软件复杂性的增加,如何保证其质量和稳定性成为开发者面临的一大挑战。自动化测试,作为现代软件开发过程中的关键实践,不仅提高了测试效率,还确保了软件产品的质量。本文将深入浅出地介绍自动化测试的概念、重要性以及实施步骤,带领读者从零基础开始,一步步构建起属于自己的软件质量防线。通过具体实例,我们将探索如何有效地设计和执行自动化测试脚本,最终实现软件开发流程的优化和产品质量的提升。无论你是软件开发新手,还是希望提高项目质量的资深开发者,这篇文章都将为你提供宝贵的指导和启示。
|
2月前
|
jenkins 测试技术 持续交付
自动化测试框架的构建与优化:提升软件交付效率的关键####
本文深入探讨了自动化测试框架的核心价值,通过对比传统手工测试方法的局限性,揭示了自动化测试在现代软件开发生命周期中的重要性。不同于常规摘要仅概述内容,本部分强调了自动化测试如何显著提高测试覆盖率、缩短测试周期、降低人力成本,并促进持续集成/持续部署(CI/CD)流程的实施,最终实现软件质量和开发效率的双重飞跃。通过具体案例分析,展示了从零开始构建自动化测试框架的策略与最佳实践,包括选择合适的工具、设计高效的测试用例结构、以及如何进行性能调优等关键步骤。此外,还讨论了在实施过程中可能遇到的挑战及应对策略,为读者提供了一套可操作的优化指南。 ####
|
2月前
|
敏捷开发 监控 测试技术
探索自动化测试框架的构建与优化####
在软件开发周期中,自动化测试扮演着至关重要的角色。本文旨在深入探讨如何构建高效的自动化测试框架,并分享一系列实用策略以提升测试效率和质量。我们将从框架选型、结构设计、工具集成、持续集成/持续部署(CI/CD)、以及最佳实践等多个维度进行阐述,为软件测试人员提供一套系统化的实施指南。 ####
|
4月前
|
SQL 监控 大数据
通过Google Dataflow,我们能够构建一个高效、可扩展且易于维护的实时数据处理系统
【9月更文挑战第7天】随着大数据时代的到来,企业对高效数据处理的需求日益增加,特别是在实时分析和事件驱动应用中。Google Dataflow作为Google Cloud Platform的一项服务,凭借其灵活、可扩展的特点,成为实时大数据处理的首选。本文将介绍Dataflow的基本概念、优势,并通过一个电商日志分析的实际案例和示例代码,展示如何构建高效的数据处理管道。Dataflow不仅支持自动扩展和高可用性,还提供了多种编程语言支持和与GCP其他服务的紧密集成,简化了整个数据处理流程。通过Dataflow,企业可以快速响应业务需求,优化用户体验。
109 3
|
5月前
|
测试技术 API 开发者
Python 魔法:打造你的第一个天气查询小工具自动化测试框架的构建与实践
【8月更文挑战第31天】在这篇文章中,我们将一起踏上编程的奇妙旅程。想象一下,只需几行代码,就能让计算机告诉你明天是否要带伞。是的,你没有听错,我们将用Python这把钥匙,解锁天气预报的秘密。不论你是编程新手还是想拓展技能的老手,这篇文章都会为你带来新的视角和灵感。所以,拿起你的键盘,让我们一起创造属于自己的天气小工具吧!
|
5月前
|
测试技术 Android开发 iOS开发
Appium 是一个开源的自动化测试框架,它支持多种平台和多种编程语言
Appium是一款开源自动化测试框架,支持iOS和Android多平台及多种编程语言。通过WebDriver协议,开发者可编写自动化测试脚本。在iPhone上实现屏幕点击等操作需安装Appium及其依赖,启动服务器,并设置所需的测试环境参数。利用Python等语言编写测试脚本,模拟用户交互行为,最后运行测试脚本来验证应用功能。对于iPhone测试,需准备真实设备或Xcode模拟器。
159 1
|
5月前
|
测试技术 虚拟化 iOS开发
iOS自动化测试方案(二):Xcode开发者工具构建WDA应用到iphone
这篇文章是iOS自动化测试方案的第二部分,详细介绍了在Xcode开发者工具中构建WebDriverAgent(WDA)应用到iPhone的全过程,包括环境准备、解决构建过程中可能遇到的错误,以及最终成功安装WDA到设备的方法。
305 0
iOS自动化测试方案(二):Xcode开发者工具构建WDA应用到iphone
|
5月前
|
SQL 监控 大数据
"解锁实时大数据处理新境界:Google Dataflow——构建高效、可扩展的实时数据管道实践"
【8月更文挑战第10天】随着大数据时代的发展,企业急需高效处理数据以实现即时响应。Google Dataflow作为Google Cloud Platform的强大服务,提供了一个完全托管的流处理与批处理方案。它采用Apache Beam编程模型,支持自动扩展、高可用性,并能与GCP服务无缝集成。例如,电商平台可通过Dataflow实时分析用户行为日志:首先利用Pub/Sub收集数据;接着构建管道处理并分析这些日志;最后将结果输出至BigQuery。Dataflow因此成为构建实时数据处理系统的理想选择,助力企业快速响应业务需求。
293 6
|
5月前
|
jenkins 测试技术 持续交付
自动化测试框架的构建与实践
【8月更文挑战第31天】本文将引导你了解自动化测试框架的重要性,并深入浅出地展示如何搭建和实施一个有效的自动化测试环境。通过实际案例,我们将一起探索自动化测试的“魔力”,解锁软件质量保障的新技能。

热门文章

最新文章