Python beautifulsoup print does not print whole html page - python

I am scraping a website that has a pagination in it. I was testing the loop and print the output in it from beautifulsoup. When the results are printed, I noticed that the result is not a complete html text. It only includes the first part of the html. Here are my code
from bs4 import BeautifulSoup
import requests
import time
total_pages = 2295
for i in range(1,total_pages,1):
pageNumber = str(i)
url = requests.get("https://www.propertyguru.com.sg/property-for-sale/"+pageNumber+"?order=desc&property_type=N&property_type_code%5B0%5D=CONDO&property_type_code%5B1%5D=APT&property_type_code%5B2%5D=WALK&property_type_code%5B3%5D=CLUS&property_type_code%5B4%5D=EXCON&sort=date").text
soup = BeautifulSoup(url,'html.parser')
print(soup.prettify())
When i print soup.prettify() the result is this
<!DOCTYPE doctype html>
<!--[if gt IE 9]><!-->
<html class="no-js is-new-brand" lang="en">
<!--<![endif]-->
<head>
<title>
</title>
<meta charset="utf-8"/>
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"/>
<meta content="width=device-width, initial-scale=1" name="viewport"/>
<meta content="app-id=482524585" name="apple-itunes-app">
<meta content="app-id=com.allproperty.android.consumer.sg" name="google-play-app">
<meta content="9iVXbwdOPHOH_byBFBScAHm5x-kvcPzBS_fJBFPBwbo" name="google-site-verification">
<meta content="46acd457be6effa0" name="y_key"/>
<meta content="893837EF69C47405FBAFAB120889A598" name="msvalidate.01"/>
<link href="/images/is-new-brand-favicon.ico" rel="SHORTCUT ICON"/>
<link href="/search.xml" rel="search" title="PropertyGuru Search" type="application/opensearchdescription+xml"/>
<link href="https://cdn.pgimgs.com/1574318624/sf2-search/bundles/guruweblayout/img/is-new-brand-touch-logo.png" rel="apple-touch-icon"/>
<link href="https://cdn.pgimgs.com/1574318624/sf2-search/bundles/guruweblayout/img/is-new-brand-touch-logo.png" rel="android-touch-icon"/>
<script>
// check for browsers without complete flex support ( < IE 10)
window.onload = function(e){
if(Function('/*#cc_on return document.documentMode<=10#*/')()) {
window.location = '/ie-notsupported';
}
};
</script>
<link href="//cdn1.pgimgs.com/1574318624/sg-static/cssprod/propertyguru/layout.css" rel="stylesheet" type="text/css"/>
<link href="//cdn1.pgimgs.com/1574318624/sg-static/cssprod/propertyguru/sg.css" rel="stylesheet" type="text/css"/>
<link href="//cdn1.pgimgs.com/1574318624/sg-static/cssprod/propertyguru/new_styles.css" rel="stylesheet" type="text/css"/>
<script src="//cdn1.pgimgs.com/1574318624/sg-static/jsprod/lib/modernizr-custom.min.js" type="text/javascript">
</script>
<script src="//cdn1.pgimgs.com/1574318624/sg-static/jsprod/jquery-1.12.3.min.js" type="text/javascript">
</script>
<script type="text/javascript">
var guruApp = {"environment":null,"widgetSearch":null,"widgetPoll":null,"widgetGoogleAnalytics":{"dimensions":{"dimension3":"Production","dimension4":"en","dimension13":"SG","dimension14":"web"},"googleAnalyticsObject":null,"config":{"trackingId":"UA-2417512-2","cookieDomain":"propertyguru.com.sg","siteSpeedSampleRate":10}},"userSession":{"user":{"id":null,"username":null,"roles":null,"shortlist":0,"beta":false}},"isResponsive":"false","identityEndpoint":"https:\/\/identity.propertyguru.com\/identity","defaultCurrency":"SGD","googleMaps":{"key":"AIzaSyBlCo7kpcBszvIZoH709avg1rmUjjiop0k"},"googleApis":{"key":"367223124563-is5hdjeal1rr7og4i8ii7t8imihr1dg1.apps.googleusercontent.com"}};
</script>
<link href="https://fonts.googleapis.com/css?family=Roboto:400,500" rel="stylesheet" type="text/css"/>
<link href="https://fonts.googleapis.com/css?family=Nunito:600" rel="stylesheet" type="text/css"/>
<!--[if gt IE 8]><!-->
<link href="https://cdn.pgimgs.com/1574318624/sf2-search/css/legacy_css.css" rel="stylesheet" type="text/css">
<link href="//cdn1.pgimgs.com/1574318624/sg-static/cssprod/rich/fixes.css" rel="stylesheet" type="text/css">
<!--<![endif]-->
<script type="text/javascript">
<!--
var GMAP_KEY = "AIzaSyCUbmYAT3lyhBvao9Yg-WsKtRbMxO-VvVQ";
var REGION = "SG";
var images = [];
var freetextUrl = '//api.propertyguru.com/v1/autocomplete?limit=10&locale=en&format=csv_legacy&region=sg&objectType=HDB_ESTATE,DISTRICT,PROPERTY,STREET,MRT_STATION,SCHOOL';
//-->
</script>
<!-- GOOGLE AD MANAGER -->
<div class="clearboth">
</div>
<!-- Begin comScore Tag -->
<script>
var _comscore = _comscore || [];
_comscore.push({ c1: "2", c2: "13151479" });
(function() {
var s = document.createElement("script"), el = document.getElementsByTagName("script")[0]; s.async = true;
s.src = (document.location.protocol == "https:" ? "https://sb" : "http://b") + ".scorecardresearch.com/beacon.js";
el.parentNode.insertBefore(s, el);
})();
</script>
<noscript>
<img src="https://sb.scorecardresearch.com/p?c1=2&c2=13151479&cv=2.0&cj=1"/>
</noscript>
<!-- End comScore Tag -->
<!-- GOOGLE ANALYTICS CODE -->
<script src="https://cdn.pgimgs.com/1574318624/sf2-search/bundles/guruweblayout/js/desktop/logger.js" type="text/javascript">
</script>
<script src="https://cdn.pgimgs.com/1574318624/sf2-search/bundles/guruweblayout/js/fingerprint2.min.js" type="text/javascript">
</script>
<script src="https://cdn.pgimgs.com/1574318624/sf2-search/bundles/guruwidget/js/desktop/jquery.widgetGoogleAnalytics.js" type="text/javascript">
</script>
<!-- Google Analytics -->
<script type="text/javascript">
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
</script>
<script type="text/javascript">
if (typeof guruApp != 'undefined' && typeof guruApp.widgetGoogleAnalytics != 'undefined' && guruApp.widgetGoogleAnalytics.googleAnalyticsObject != null) {
guruApp.widgetGoogleAnalytics.googleAnalyticsObject.init();
}
</script>
<script src="https://cdn.pgimgs.com/1574318624/sf2-search/bundles/guruweblayout/js/desktop/jquery.eventDispatcher.js" type="text/javascript">
</script>
<script type="text/javascript">
$(document).ready(function () {
var $body = $('body'),
track = function(category, action, label, value, noninteraction, dimensions) {
label = cleanText(label);
guruApp.widgetGoogleAnalytics.googleAnalyticsObject.trackEvent(category, action, label, value, noninteraction, dimensions);
},
cleanText = function(str) {
return str.replace(/^https?:\/\/[^\/]+/, '').replace(/^\s+/, '').replace(/\s+$/, '').replace(/\s+/, ' ');
};
$body.find('.dropdown .dropdown-menu li.mainnav-areainsider').click(function () {
$body.trigger('ga.mainnav.areainsider.click');
});
});
</script>
<!-- ELOQUA TRACKING CODE -->
<script type="text/javascript">
var _elqQ = _elqQ || [];
_elqQ.push(['elqSetSiteId', '659351510']);
_elqQ.push(['elqTrackPageView']);
(function () {
function async_load() {
var s = document.createElement('script'); s.type = 'text/javascript'; s.async = true;
s.src = '//img03.en25.com/i/elqCfg.min.js';
var x = document.getElementsByTagName('script')[0]; x.parentNode.insertBefore(s, x);
}
if (window.addEventListener) window.addEventListener('DOMContentLoaded', async_load, false);
else if (window.attachEvent) window.attachEvent('onload', async_load);
})();
</script>
<script defer="" src="/pg186791.js" type="text/javascript">
</script>
<style type="text/css">
#d__fFH{position:absolute;top:-5000px;left:-5000px}#d__fF{font-family:serif;font-size:200px;visibility:hidden}#weeawqsxdstyxxvz{display:none!important}
</style>
</link>
</link>
</meta>
</meta>
</meta>
</head>
<body class="web_filter_recaptcha SG-web_filter_recaptcha layout-web lang-en app-sg legacy is-new-brand" id="web_filter_recaptcha">
<div id="wrapper-outer">
<div id="wrapper">
<div id="wrapper-inner">
<div class="alert alert-warning" id="gdpr-alert" role="alert" style="margin-bottom: 0; display:none;">
To comply with GDPR we will not store any personally identifiable information from you. Therefore we will serve sub-optimal experience where some features such as Login/Signup are disabled. However, you will be able to search and see all the properties, see agent contact details and contact them offline on your own.
</div>
<header class="navbar navbar-default" id="navbar-main">
<div class="header-bg">
<div class="container">
<nav class="header-nav clearfix" role="navigation">
<div class="navbar-header">
<button class="navbar-toggle" type="button">
<span class="sr-only">
Toggle navigation
</span>
<i class="pgicon pg
<!DOCTYPE doctype html>
<!--[if gt IE 9]><!-->
<html class="no-js is-new-brand" lang="en">
<!--<![endif]-->
<head>.....AND SO ON AND SO FOURTH
It only prints some contents but not the whole html contents.

You are using requests library, so it does not loads the javascripts. This website is using API to populate the data which use javascript.
You should try using selenium. Selenium will load the whole page with javascript. Then read the page_source and use beautifulsoup.

Beautiful-soup library extracts only the view-source of an web page.
Ex:(view-source:https://www.propertyguru.com.sg/property-for-sale/1?order=desc&property_type=N&property_type_code%5B0%5D=CONDO&property_type_code%5B1%5D=APT&property_type_code%5B2%5D=WALK&property_type_code%5B3%5D=CLUS&property_type_code%5B4%5D=EXCON&sort=date)
Beautiful-soup library is working fine..
from bs4 import BeautifulSoup
import requests
import time
total_pages = 2295
for i in range(1,total_pages,1):
pageNumber = str(i)
url = requests.get("https://www.propertyguru.com.sg/property-for-sale/"+pageNumber+"?order=desc&property_type=N&property_type_code%5B0%5D=CONDO&property_type_code%5B1%5D=APT&property_type_code%5B2%5D=WALK&property_type_code%5B3%5D=CLUS&property_type_code%5B4%5D=EXCON&sort=date").text
soup = BeautifulSoup(url,'html.parser')
print(soup.prettify())

Related

How is data being fetched

While working on finding how data is being processed on the webpage. I was figuring out this site investorscout.co/investors.
I tried looking at the Network tab to see how they are rendering the data from backend onto the page. I have also looked into WS but no luck.
I am confused as to how the site is able to display the data while none of the requests in the Network tab shows that.
I aim to fetch the data using requests and bs4.
Sending a GET request to the page https://investorscout.co/investors returns a response with multiple references to external JavaScript code in it. This is what is being loaded on the page - dynamic content based on JavaScript functions.
I would suggest an implementation involving selenium instead as you would not be able to scrape content on the page otherwise.
HTML code of page for reference:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width,initial-scale=1,shrink-to-fit=no"
/>
<meta name="theme-color" content="#000000" />
<link rel="manifest" href="/manifest.json" />
<link rel="”shortcut" icon” href="”/favicon.ico”" />
<title>Investor Scout</title>
<script>
!function(n,u){n._rwq=u,n[u]=n[u]||function(){(n[u].q=n[u].q||[]).push(arguments)}}(window,"rewardful")
</script>
<script
async
src="https://r.wdfl.co/rw.js"
data-rewardful="76b542"
></script>
<script type="text/javascript">
var _iub=_iub||[];_iub.csConfiguration={consentOnContinuedBrowsing:!1,ccpaAcknowledgeOnDisplay:!0,whitelabel:!1,lang:"en",siteId:2020596,enableCcpa:!0,countryDetection:!0,cookiePolicyId:26558236,banner:{acceptButtonDisplay:!0,customizeButtonDisplay:!0,acceptButtonColor:"#0073CE",acceptButtonCaptionColor:"white",customizeButtonColor:"#DADADA",customizeButtonCaptionColor:"#4D4D4D",rejectButtonColor:"#0073CE",rejectButtonCaptionColor:"white",position:"float-top-center",textColor:"black",backgroundColor:"white"}}
</script>
<script
type="text/javascript"
src="//cdn.iubenda.com/cs/ccpa/stub.js"
></script>
<script
type="text/javascript"
src="//cdn.iubenda.com/cs/iubenda_cs.js"
charset="UTF-8"
async
></script>
<script
defer="defer"
src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"
></script>
<script type="text/javascript">
window.__lo_site_id=176375,function(){var t=document.createElement("script");t.type="text/javascript",t.async=!0,t.src="https://d10lpsik1i8c69.cloudfront.net/w.js";var e=document.getElementsByTagName("script")[0];e.parentNode.insertBefore(t,e)}()
</script>
<script type="text/javascript">
window.$crisp=[],window.CRISP_WEBSITE_ID="95efad36-fefd-4cf1-ae4b-a3bb5a61360c",d=document,s=d.createElement("script"),s.src="https://client.crisp.chat/l.js",s.async=1,d.getElementsByTagName("head")[0].appendChild(s)
</script>
<link href="/static/css/main.fc05b0f9.chunk.css" rel="stylesheet" />
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<script>
!function(e){function t(t){for(var n,i,l=t[0],f=t[1],a=t[2],p=0,s=[];p<l.length;p++)i=l[p],Object.prototype.hasOwnProperty.call(o,i)&&o[i]&&s.push(o[i][0]),o[i]=0;for(n in f)Object.prototype.hasOwnProperty.call(f,n)&&(e[n]=f[n]);for(c&&c(t);s.length;)s.shift()();return u.push.apply(u,a||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,l=1;l<r.length;l++){var f=r[l];0!==o[f]&&(n=!1)}n&&(u.splice(t--,1),e=i(i.s=r[0]))}return e}var n={},o={1:0},u=[];function i(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,i),r.l=!0,r.exports}i.m=e,i.c=n,i.d=function(e,t,r){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(i.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(r,n,function(t){return e[t]}.bind(null,n));return r},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="/";var l=this["webpackJsonpinvestor-scout"]=this["webpackJsonpinvestor-scout"]||[],f=l.push.bind(l);l.push=t,l=l.slice();for(var a=0;a<l.length;a++)t(l[a]);var c=f;r()}([])
</script>
<script src="/static/js/2.540fc93a.chunk.js"></script>
<script src="/static/js/main.9ac00620.chunk.js"></script>
</body>
</html>

div Web Scrape on site output returns None

I was trying to web scrape the past multipliers on https://roobet.com/crash . But When I try to run the program there is no results. What's the problem? Code is below
from bs4 import BeautifulSoup
import requests
source = requests.get('https://roobet.com/crash').text
soup = BeautifulSoup(source, 'lxml')
title = soup.find('title').text
results = soup.find_all('div', attrs={'class': 'jss75'})
for i in results:
multi = i.find('span', attrs={"class":"jss75"})
if multi is not None:
print('multi:', multi).text
Thanks for the help!
Take a look at the returned source and you may understand why you cannot find the result you are looking for.
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-563FCQS');</script>
<!-- End Google Tag Manager -->
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="preconnect" href="https://fonts.googleapis.com/" crossorigin>
<title>Roobet | Crypto's Fastest Growing Casino</title>
<meta name="description" content="Roobet, crypto's fastest growing casino. Hop on in, chat to others and play exciting games - Come and join the fun!">
<base href="/">
<meta name="theme-color" content="#191b31" />
<link rel="icon" type="image/png" href="images/favicon.png">
<link rel="manifest" href="/manifest.json" />
<script src="https://cdn.onesignal.com/sdks/OneSignalSDK.js" async ></script>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCXI19SE-ZWv_ZyW7gGMzCTf4TGfOA3Sdk&libraries=places"></script>
<script src="https://tekhou5-dk2.pragmaticplay.net/gs2c/common/js/lobby/GameLib.js" />
<script>
var OneSignal = window.OneSignal || [];
OneSignal.push(function() {
OneSignal.init({
appId: "29c72f64-e7e6-408c-99b2-d86a84c6a9cb",
notifyButton: {
enable: false,
autoResubscribe: true,
},
welcomeNotification: {
disable: true
}
});
});
</script>
<link href="0.aafac69fdc9eee2864e9.css" rel="stylesheet"><link href="app.aafac69fdc9eee2864e9.css" rel="stylesheet"></head>
<body>
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-563FCQS"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
<div id="root"></div>
<div id="modalRoot"></div>
<div id="loader">
<div class="loaderLogo">
<img src="/images/logo.svg" />
</div>
</div>
<script type="text/javascript" src="vendors.37e373e3e07a018e2e49.bundle.js"></script><script type="text/javascript" src="locale.9c51b6a88780f5e87cd3.bundle.js"></script><script type="text/javascript" src="app.7bee5f919f764925b254.bundle.js"></script></body>
<script>(function(){var w=window;var ic=w.Intercom;if(typeof ic==="function"){ic('reattach_activator');ic('update',intercomSettings);}else{var d=document;var i=function(){i.c(arguments)};i.q=[];i.c=function(args){i.q.push(args)};w.Intercom=i;function l(){var s=d.createElement('script');s.type='text/javascript';s.async=true;s.src='https://widget.intercom.io/widget/gcr7bzde';var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s,x);}if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}}})()</script>
<script src="https://intaggr.softswiss.net/public/sg.js"></script>
<script type="text/javascript" src="https://www.google.com/recaptcha/api.js?render=6LdG97YUAAAAAHMcbX2hlyxQiHsWu5bY8_tU-2Y_"></script>
<script type="text/javascript">
if (typeof window.grecaptcha !== 'undefined') {
grecaptcha.ready(function() {
grecaptcha.execute('6LdG97YUAAAAAHMcbX2hlyxQiHsWu5bY8_tU-2Y_', {action: 'homepage'});
})
}
</script>
</html>
When you inspect element on then website the div containing the multipliers that your looking for is there. <div class="jss75"> however in the above source you can see the body of the HTML file contains is script imports which generates the HTML you are looking for.
Some of the data you are looking for might be contained in the other files retrieved by the website (open dev tools, go to the network tab and reload). The recentNumbers file looks like it might contain what you need (I'm not familiar with the website) it contains many data points ladled as crashPoint which look like they are the multipliers you are looking for.
https://api.roobet.com/crash/recentNumbers
If this isn't what your looking for i can take a deeper look, or as i say checkout the network tab and all the data it pulls in.

Python | Selenium cannot detect button

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
import os
Game_Pin = input('Enter your PIN: ')
NickNAME = input('Enter your nickname: ')
driver = webdriver.Chrome(executable_path=r"C:\WebDriver\bin\chromedriver.exe")
def Enter_Press(driver):
driver.find_element_by_xpath("//*[contains(text(), 'Enter')]").click()
def OK_GO(driver):
driver.find_element_by_xpath("//*[contains(text(), 'OK, go!')]").click()
def Kahoot_Spammer(Game_Pin, NickNAME, driver):
driver.get('https://kahoot.it/')
driver.maximize_window() #For maximizing window
driver.implicitly_wait(2) #gives an implicit wait for 2 seconds
game_pin = driver.find_element_by_xpath("//*[#id='inputSession']")
game_pin.send_keys(Game_Pin)
Enter_Press(driver)
driver.implicitly_wait(2)
Name = driver.find_element_by_xpath("//*[#id='username']")
Name.send_keys(NickNAME)
OK_GO(driver)
Kahoot_Spammer(Game_Pin, NickNAME, driver)
This is the code. Its supposed to open a chrome browser and navigate to the Kahoot.it website. Then take what information you gave it and put it in for you. It works for the first part of entering a game but once it gets to create your nickname it cannot detect the OK, go! button.
driver.find_element_by_xpath("//*[contains(text(), 'OK, go!')]").click()
I've inspected the button but cannot seem to find what to put within the code above. Any ideas?
Here is the source code.
<!doctype html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7" lang="en"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8" lang="en"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9" lang="en"> <![endif]-->
<!--[if IE 9]> <html class="no-js lt-ie10" lang="en"> <![endif]-->
<!--[if gt IE 9]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Kahoot!</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, minimum-scale=1.0"/>
<meta name="viewport" content="initial-scale=1, maximum-scale=1.0, minimum-scale=1.0" media="(device-height: 568px)"/>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-itunes-app" content="app-id=1131203560">
<meta name="description" content="Join a game of kahoot here. Kahoot! is a free game-based learning platform that makes it fun to learn – any subject, in any language, on any device, for all ages!">
<meta name="keywords" content="education, platform, smart phone, tablet, mobile, social, inclusive, HTML5, classroom, engagement, play, game, fun, quiz, multi-player, pedagogy, learning model, learn, gamification." />
<link rel="shortcut icon" href="/shared/theme/kahoot/img/icons/favicon.ico">
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="/shared/theme/kahoot/img/icons/touch_icon_144.png">
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="/shared/theme/kahoot/img/icons/touch_icon_114.png">
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="/shared/theme/kahoot/img/icons/touch_icon_72.png">
<link rel="apple-touch-icon-precomposed" href="/shared/theme/kahoot/img/icons/touch_icon_57.png">
<link rel="stylesheet" type="text/css" href="/shared/css/cloak.css">
<div style="height: 0; width: 0; position: absolute; visibility: hidden">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><filter x="-2.2%" y="-2.3%" width="104.4%" height="104.8%" filterUnits="objectBoundingBox" id="a"><feOffset dy="1" in="SourceAlpha" result="shadowOffsetOuter1"/><symbol id="logo-shapes" viewBox="0 0 24 24"><ellipse cx="5.506" cy="18.966" rx="4.953" ry="4.953"/><path d="M12.005 5.902L17.873.033l5.869 5.869-5.869 5.868zm1.443 8.899h8.849v8.849h-8.849zm-2.584-4.977H.146l5.36-8.555z"/></symbol></svg>
</div>
<script src="https://tap-nexus.appspot.com/js/sdk/kahunaAPI_min.js"></script>
<script type="text/javascript">
(function(e,t){var n=e.amplitude||{_q:[],_iq:{}};var r=t.createElement("script");r.type="text/javascript";
r.async=true;r.src="https://d24n15hnbwhuhn.cloudfront.net/libs/amplitude-3.4.0-min.gz.js";
r.onload=function(){e.amplitude.runQueuedFunctions()};var i=t.getElementsByTagName("script")[0];
i.parentNode.insertBefore(r,i);function s(e,t){e.prototype[t]=function(){this._q.push([t].concat(Array.prototype.slice.call(arguments,0)));
return this}}var o=function(){this._q=[];return this};var a=["add","append","clearAll","prepend","set","setOnce","unset"];
for(var u=0;u<a.length;u++){s(o,a[u])}n.Identify=o;var c=function(){this._q=[];return this;
};var p=["setProductId","setQuantity","setPrice","setRevenueType","setEventProperties"];
for(var l=0;l<p.length;l++){s(c,p[l])}n.Revenue=c;var d=["init","logEvent","logRevenue","setUserId","setUserProperties","setOptOut","setVersionName","setDomain","setDeviceId","setGlobalUserProperties","identify","clearUserProperties","setGroup","logRevenueV2","regenerateDeviceId","logEventWithTimestamp","logEventWithGroups"];
function v(e){function t(t){e[t]=function(){e._q.push([t].concat(Array.prototype.slice.call(arguments,0)));
}}for(var n=0;n<d.length;n++){t(d[n])}}v(n);n.getInstance=function(e){e=(!e||e.length===0?"$default_instance":e).toLowerCase();
if(!n._iq.hasOwnProperty(e)){n._iq[e]={_q:[]};v(n._iq[e])}return n._iq[e]};e.amplitude=n;
})(window,document);
</script>
<base href="/">
<script type="text/javascript">
document.write('<scri'+'pt ');
document.write('type="text/javascript" ');
document.write('src="'+'/shared/theme/config.js');
document.write("?"+new Date().getTime()+'">');
document.write('</scri'+'pt>');
</script>
</head>
<body snitch ios7-viewport-fix>
<noscript>
<h1>Kahoot! needs JavaScript to work</h1>
<p>
To use Kahoot!, you need to have JavaScript enabled in your browser. To enable JavaScript, please do the following:
</p>
<ul>
<li>Follow these instructions.</li>
<li>Make sure you have the latest browser.</li>
<li>Turn off or disable the NoScript extension, if you have it.</li>
<li>Contact your IT administrator to allow access to Kahoot! in your security preferences.</li>
</ul>
<p>If you continue to have problems, please let us know by contacting Kahoot! support.</p>
</noscript>
<div id="debug-info" debug-info="dev,test" debug-timestamp></div>
<dev-mode></dev-mode>
<div class="loader" loader></div>
<iframe
id="gameBlockIframe"
style="display:none;"
class="game-block-iframe"
sandbox="allow-scripts allow-same-origin"
scrolling="no">
</iframe>
<div id="mainView" ng-cloak ng-view>
<h1>Join in a Kahoot! here</h1>
<p>To learn more about Kahoot! visit kahoot.com</p>
</div>
<div ng-cloak alerts></div>
<script type="text/javascript" src="/js/bootstrap.js"></script>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
function gup( name, url ) {
if (!url) url = location.href;
name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
var regexS = "[\\?&]"+name+"=([^&#]*)";
var regex = new RegExp( regexS );
var results = regex.exec( url );
return results == null ? null : results[1];
}
var clientId = gup('gaId', window.location.search);
if (clientId) {
ga('create', 'UA-35308575-1', 'auto', {'allowLinker': true, 'clientId':gup('gaId', window.location.search)});
ga('create', 'UA-35308575-4', 'auto', {'name': 'legacy', 'clientId':gup('gaId', window.location.search)});
var platform = gup('platform', window.location.search);
if (typeof platform === 'string' && platform == 'iOS') {
window.ga('set', 'appName', 'Kahoot');
window.ga('set', 'appId', 'no.mobitroll.kahoot.controller');
}
if (typeof platform === 'string' && platform == 'Android') {
window.ga('set', 'appName', 'Kahoot');
window.ga('set', 'appId', 'no.mobitroll.kahoot.android');
}
} else {
ga('create', 'UA-35308575-1', 'auto', {'allowLinker': true});
ga('create', 'UA-35308575-4', 'auto', {'name': 'legacy'});
}
ga('send', 'pageview');
ga('legacy.send', 'pageview');
</script>
</body>
</html>
implicitly_wait needs to only be declared once when driver is initialized. To explicitly wait a specified number of seconds, you may use time.sleep(), although the more practical solution is just dynamically wait for the element to be present/clickable using Selenium's WebDriverWait.

Version issue with embedding bokeh on heroku app

I am having a problem embedding Bokeh on Heroku. It works fine on my local machine, but something is wrong, when I try on heroku. Below is the html file. My guess is the data is not embedding correctly. For instance __ndarray__ has some weird characters instead of the data. I had been struggling to find a solution. Can someone provide help?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Time-series plot</title>
<link rel="stylesheet" href="http://cdn.bokeh.org/bokeh/release/bokeh-0.12.3.min.css" type="text/css" />
<script type="text/javascript" src="http://cdn.bokeh.org/bokeh/release/bokeh-0.12.3.min.js"></script>
<script type="text/javascript">
(function() {
var fn = function() {
Bokeh.safely(function() {
var docs_json = {"25435e2e-0cb3-47b8-8bf1-32c906b6f420":{"roots":{"references":[{"attributes":{"callback":null},"id":"10baebf3-faeb-46d1-859d-3263c6cd9354","type":"DataRange1d"},{"attributes":{"line_alpha":{"value":0.1},"line_color":{"value":"#1f77b4"},"x":{"field":"x"},"y":{"field":"y"}},"id":"2be1d120-5724-460f-b0f0-7231d7e46726","type":"Line"},{"attributes":{"base":60,"mantissas":[1,2,5,10,15,20,30],"max_interval":1800000.0,"min_interval":1000.0,"num_minor_ticks":0},"id":"062863cd-1ed4-4b1a-af68-b016860bd87a","type":"AdaptiveTicker"},{"attributes":{"bottom_units":"screen","fill_alpha":{"value":0.5},"fill_color":{"value":"lightgrey"},"left_units":"screen","level":"overlay","line_alpha":{"value":1.0},"line_color":{"value":"black"},"line_dash":[4,4],"line_width":{"value":2},"plot":null,"render_mode":"css","right_units":"screen","top_units":"screen"},"id":"616ed4ac-d4c5-4010-beff-1589b8b73f52","type":"BoxAnnotation"},{"attributes":{"max_interval":500.0,"num_minor_ticks":0},"id":"9517227c-f613-42bc-a35e-ae3c9543f317","type":"AdaptiveTicker"},{"attributes":{"items":[{"id":"2fd93036-1ef3-4d56-bad7-88fdf9352c21","type":"LegendItem"}],"location":"top_left","plot":{"id":"8fa14872-25cd-4dec-82ab-b1dd9b8a852f","subtype":"Figure","type":"Plot"}},"id":"13ee15d7-a5bd-40c8-b896-6d8955b883ee","type":"Legend"},{"attributes":{},"id":"751d139b-ceca-4eec-acbd-41e25b434a73","type":"DatetimeTickFormatter"},{"attributes":{},"id":"34d4f26b-a640-4129-88fd-578633815bbd","type":"YearsTicker"},{"attributes":{"below":[{"id":"f8b00322-303d-4c46-a577-b48573240aa7","type":"DatetimeAxis"}],"left":[{"id":"77143d5d-525f-4d25-acea-5c424eded496","type":"LinearAxis"}],"plot_height":500,"plot_width":800,"renderers":[{"id":"f8b00322-303d-4c46-a577-b48573240aa7","type":"DatetimeAxis"},{"id":"aa08aef8-adbe-4ac9-bb30-3276e6833765","type":"Grid"},{"id":"77143d5d-525f-4d25-acea-5c424eded496","type":"LinearAxis"},{"id":"bff245c2-03a5-411c-a938-515909623506","type":"Grid"},{"id":"616ed4ac-d4c5-4010-beff-1589b8b73f52","type":"BoxAnnotation"},{"id":"4311d6d9-1db1-4a28-b427-4f0d3da33a8d","type":"BoxAnnotation"},{"id":"13ee15d7-a5bd-40c8-b896-6d8955b883ee","type":"Legend"},{"id":"baee81d6-e664-46ba-b9d3-2e030d7fd672","type":"GlyphRenderer"}],"title":{"id":"ed0051be-e237-4b47-8663-afb3b1f1ce7c","type":"Title"},"tool_events":{"id":"93f77166-b47d-4147-8f40-60587534bb6e","type":"ToolEvents"},"toolbar":{"id":"9af07266-a889-4c6c-8e88-7a1f31d740f0","type":"Toolbar"},"x_range":{"id":"10baebf3-faeb-46d1-859d-3263c6cd9354","type":"DataRange1d"},"y_range":{"id":"4ffcdd86-22b4-4b7a-be07-ac70c84c27db","type":"DataRange1d"}},"id":"8fa14872-25cd-4dec-82ab-b1dd9b8a852f","subtype":"Figure","type":"Plot"},{"attributes":{"band_fill_alpha":{"value":0.1},"band_fill_color":{"value":"olive"},"dimension":1,"grid_line_alpha":{"value":0},"plot":{"id":"8fa14872-25cd-4dec-82ab-b1dd9b8a852f","subtype":"Figure","type":"Plot"},"ticker":{"id":"06fb8ff2-d611-405b-be38-e171cbf46d8c","type":"BasicTicker"}},"id":"bff245c2-03a5-411c-a938-515909623506","type":"Grid"},{"attributes":{"months":[0,2,4,6,8,10]},"id":"5fc979d4-46a9-469c-af56-527c9d4cb163","type":"MonthsTicker"},{"attributes":{"num_minor_ticks":5},"id":"f897d924-3e38-464c-a5af-8eb5d3b68094","type":"DatetimeTicker"},{"attributes":{"data_source":{"id":"6d6fc44a-63fb-4b3d-95b8-3d219a92f1ca","type":"ColumnDataSource"},"glyph":{"id":"dfd7789a-7064-469a-aed1-0f49e3bb6fb7","type":"Line"},"hover_glyph":null,"nonselection_glyph":{"id":"2be1d120-5724-460f-b0f0-7231d7e46726","type":"Line"},"selection_glyph":null},"id":"baee81d6-e664-46ba-b9d3-2e030d7fd672","type":"GlyphRenderer"},{"attributes":{},"id":"06fb8ff2-d611-405b-be38-e171cbf46d8c","type":"BasicTicker"},{"attributes":{"days":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]},"id":"413be9a6-f974-4bb0-a547-fd109820f4ac","type":"DaysTicker"},{"attributes":{"active_drag":"auto","active_scroll":"auto","active_tap":"auto","tools":[{"id":"ad71abf4-7812-47df-974c-bdf963267996","type":"PanTool"},{"id":"4651a289-09bc-4249-ab43-dcf8d0073edf","type":"WheelZoomTool"},{"id":"a630d9b3-35fa-4631-8971-6ffe63f5f285","type":"BoxZoomTool"},{"id":"2d21e9c6-d52c-4788-a4c1-96bb295c2421","type":"ResetTool"},{"id":"94e83390-ed62-4543-81c3-177bb7404bd0","type":"SaveTool"},{"id":"7d10de35-f889-4af5-a737-7b7e18177842","type":"BoxSelectTool"}]},"id":"9af07266-a889-4c6c-8e88-7a1f31d740f0","type":"Toolbar"},{"attributes":{"callback":null},"id":"4ffcdd86-22b4-4b7a-be07-ac70c84c27db","type":"DataRange1d"},{"attributes":{"days":[1,8,15,22]},"id":"f1182eaa-c07f-4f7a-b6e2-e2e003b26503","type":"DaysTicker"},{"attributes":{"plot":null,"text":"Data for GOOG from Quandle WIKI set"},"id":"ed0051be-e237-4b47-8663-afb3b1f1ce7c","type":"Title"},{"attributes":{"base":24,"mantissas":[1,2,4,6,8,12],"max_interval":43200000.0,"min_interval":3600000.0,"num_minor_ticks":0},"id":"2cee3978-4144-4aee-9971-b93db0a60f31","type":"AdaptiveTicker"},{"attributes":{"plot":{"id":"8fa14872-25cd-4dec-82ab-b1dd9b8a852f","subtype":"Figure","type":"Plot"}},"id":"94e83390-ed62-4543-81c3-177bb7404bd0","type":"SaveTool"},{"attributes":{"plot":{"id":"8fa14872-25cd-4dec-82ab-b1dd9b8a852f","subtype":"Figure","type":"Plot"}},"id":"2d21e9c6-d52c-4788-a4c1-96bb295c2421","type":"ResetTool"},{"attributes":{"callback":null,"column_names":["x","y"],"data":{"x":{"__ndarray__":"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","dtype":"float64","shape":[711]},"y":{"__ndarray__":"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","dtype":"float64","shape":[711]}}},"id":"6d6fc44a-63fb-4b3d-95b8-3d219a92f1ca","type":"ColumnDataSource"},{"attributes":{},"id":"93f77166-b47d-4147-8f40-60587534bb6e","type":"ToolEvents"},{"attributes":{"line_color":{"value":"blue"},"x":{"field":"x"},"y":{"field":"y"}},"id":"dfd7789a-7064-469a-aed1-0f49e3bb6fb7","type":"Line"},{"attributes":{"grid_line_alpha":{"value":0},"plot":{"id":"8fa14872-25cd-4dec-82ab-b1dd9b8a852f","subtype":"Figure","type":"Plot"},"ticker":{"id":"f897d924-3e38-464c-a5af-8eb5d3b68094","type":"DatetimeTicker"}},"id":"aa08aef8-adbe-4ac9-bb30-3276e6833765","type":"Grid"},{"attributes":{"label":{"value":"Adj. Close"},"renderers":[{"id":"baee81d6-e664-46ba-b9d3-2e030d7fd672","type":"GlyphRenderer"}]},"id":"2fd93036-1ef3-4d56-bad7-88fdf9352c21","type":"LegendItem"},{"attributes":{"plot":{"id":"8fa14872-25cd-4dec-82ab-b1dd9b8a852f","subtype":"Figure","type":"Plot"}},"id":"ad71abf4-7812-47df-974c-bdf963267996","type":"PanTool"},{"attributes":{},"id":"48053516-3d87-4026-986f-48129fc60e01","type":"BasicTickFormatter"},{"attributes":{"months":[0,6]},"id":"36d97b27-7fc5-4095-a5b7-6ec9003c8381","type":"MonthsTicker"},{"attributes":{"axis_label":"Date","formatter":{"id":"751d139b-ceca-4eec-acbd-41e25b434a73","type":"DatetimeTickFormatter"},"plot":{"id":"8fa14872-25cd-4dec-82ab-b1dd9b8a852f","subtype":"Figure","type":"Plot"},"ticker":{"id":"f897d924-3e38-464c-a5af-8eb5d3b68094","type":"DatetimeTicker"}},"id":"f8b00322-303d-4c46-a577-b48573240aa7","type":"DatetimeAxis"},{"attributes":{"days":[1,15]},"id":"5c4984ed-252e-4eae-a6a2-1cf39a55814a","type":"DaysTicker"},{"attributes":{"months":[0,1,2,3,4,5,6,7,8,9,10,11]},"id":"4d867e4d-d57d-47b0-a9ed-037e2feeb430","type":"MonthsTicker"},{"attributes":{"bottom_units":"screen","fill_alpha":{"value":0.5},"fill_color":{"value":"lightgrey"},"left_units":"screen","level":"overlay","line_alpha":{"value":1.0},"line_color":{"value":"black"},"line_dash":[4,4],"line_width":{"value":2},"plot":null,"render_mode":"css","right_units":"screen","top_units":"screen"},"id":"4311d6d9-1db1-4a28-b427-4f0d3da33a8d","type":"BoxAnnotation"},{"attributes":{"callback":null,"overlay":{"id":"4311d6d9-1db1-4a28-b427-4f0d3da33a8d","type":"BoxAnnotation"},"plot":{"id":"8fa14872-25cd-4dec-82ab-b1dd9b8a852f","subtype":"Figure","type":"Plot"},"renderers":[{"id":"baee81d6-e664-46ba-b9d3-2e030d7fd672","type":"GlyphRenderer"}]},"id":"7d10de35-f889-4af5-a737-7b7e18177842","type":"BoxSelectTool"},{"attributes":{"days":[1,4,7,10,13,16,19,22,25,28]},"id":"18e0bad7-fd4d-483a-a66d-8326fd4cb8d4","type":"DaysTicker"},{"attributes":{"axis_label":"Price","formatter":{"id":"48053516-3d87-4026-986f-48129fc60e01","type":"BasicTickFormatter"},"plot":{"id":"8fa14872-25cd-4dec-82ab-b1dd9b8a852f","subtype":"Figure","type":"Plot"},"ticker":{"id":"06fb8ff2-d611-405b-be38-e171cbf46d8c","type":"BasicTicker"}},"id":"77143d5d-525f-4d25-acea-5c424eded496","type":"LinearAxis"},{"attributes":{"months":[0,4,8]},"id":"541618b2-937c-4225-a9e3-c94d0e9cac89","type":"MonthsTicker"},{"attributes":{"plot":{"id":"8fa14872-25cd-4dec-82ab-b1dd9b8a852f","subtype":"Figure","type":"Plot"}},"id":"4651a289-09bc-4249-ab43-dcf8d0073edf","type":"WheelZoomTool"},{"attributes":{"overlay":{"id":"616ed4ac-d4c5-4010-beff-1589b8b73f52","type":"BoxAnnotation"},"plot":{"id":"8fa14872-25cd-4dec-82ab-b1dd9b8a852f","subtype":"Figure","type":"Plot"}},"id":"a630d9b3-35fa-4631-8971-6ffe63f5f285","type":"BoxZoomTool"}],"root_ids":["8fa14872-25cd-4dec-82ab-b1dd9b8a852f"]},"title":"Bokeh Application","version":"0.12.4"}};
var render_items = [{"docid":"25435e2e-0cb3-47b8-8bf1-32c906b6f420","elementid":"f91b2880-937e-436d-88b0-04c339475f6f","modelid":"8fa14872-25cd-4dec-82ab-b1dd9b8a852f"}];
Bokeh.embed.embed_items(docs_json, render_items);
});
};
if (document.readyState != "loading") fn();
else document.addEventListener("DOMContentLoaded", fn);
})();
</script>
</head>
<body>
<div class=page>
<h1> Generated plot for GOOG </h1>
<h4> Back</h4>
<div class="bk-root">
<div class="bk-plotdiv" id="f91b2880-937e-436d-88b0-04c339475f6f"></div>
</div>
</div>
</body>
</html>
Problem to be the versioning of bokeh. In the html file had 0.12.3, but my requirements.txt had bokeh>=0.12.3, and because of which heroku was using 0.12.4. Changing the requirements.txt file to bokeh==0.12.3 fixed the problem.

Python Flask + AngularJS + DevExtreme

First, I am fairly new to javascript but I know my way around python. I am trying to learn javascript and I may be out of my league with trying this, but that is how you learn right.
Secondly, Flask and AngularJS play well together with a little help. Special thanks goes to shea256 (https://github.com/shea256/angular-flask)
Now, I am able to get the 'test application' up and running fairly easily.
However, I want to add DevExtreme to this stack and I am having some issues.
Here is what I have:
index.html
<!doctype html>
<html lang="en" ng-app="AngularFlask">
<head>
<meta charset="utf-8">
<title>AngularFlask</title>
<link rel="stylesheet" href="/static/css/bootstrap.css">
<link rel="stylesheet" href="/static/css/main.css">
<link rel="stylesheet" type="text/css" href="http://cdn3.devexpress.com/jslib/16.1.5/css/dx.common.css" />
<link rel="stylesheet" type="text/css" href="http://cdn3.devexpress.com/jslib/16.1.5/css/dx.light.css" />
<!--<script src="/static/lib/jquery/jquery.min.js"></script>-->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script> <!--2.7.0-->
<!--<script src="/static/lib/angular/angular.js"></script>
<script src="/static/lib/angular/angular-resource.js"></script>-->
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular-resource.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular-route.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular-sanitize.min.js"></script>
<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/globalize/0.1.1/globalize.min.js"></script>
<!--<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/2.2.3/jquery.min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.16/angular.min.js"></script>
-->
<script type="text/javascript" src="http://cdn3.devexpress.com/jslib/16.1.5/js/dx.web.js"></script>
<script src="/static/js/app.js"></script>
<script src="/static/js/controllers.js"></script>
<script src="/static/js/services.js"></script>
<script src="/static/lib/bootstrap/bootstrap.min.js"></script>
</head>
<body>
<div id="header" class="header navbar navbar-static-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
</button>
<a class="brand" href="/">AngularFlask</a>
<div class="nav-collapse collapse">
<ul class="nav pull-right">
<li class="">
Home
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="container page">
<div id="content" class="container main" ng-view>
</div>
<hr>
<footer id="footer" class="footer">
<div class="footer-left">
About |
Home
</div>
<div class="footer-right">
<span>© 2013 AngularFlask</span>
</div>
</footer>
</div>
</body>
</html>
controllers.js
function IndexController($scope) {
}
function AboutController($scope) {
}
function PostListController($scope, Post) {
var postsQuery = Post.get({}, function(posts) {
$scope.posts = posts.objects;
});
}
function PostDetailController($scope, $routeParams, Post) {
var postQuery = Post.get({ postId: $routeParams.postId }, function(post) {
$scope.post = post;
});
}
app.js
'use strict';
angular.module('AngularFlask', ['angularFlaskServices', 'dx'])
.config(['$routeProvider', '$locationProvider',
function($routeProvider, $locationProvider) {
$routeProvider
.when('/', {
templateUrl: 'static/partials/landing.html',
controller: IndexController
})
.when('/about', {
templateUrl: 'static/partials/about.html',
controller: AboutController
})
.when('/post', {
templateUrl: 'static/partials/post-list.html',
controller: PostListController
})
.when('/post/:postId', {
templateUrl: '/static/partials/post-detail.html',
controller: PostDetailController
})
/* Create a "/blog" route that takes the user to the same place as "/post" */
.when('/blog', {
templateUrl: 'static/partials/post-list.html',
controller: PostListController
})
.otherwise({
redirectTo: '/'
})
;
$locationProvider.html5Mode(true);
}])
;
With this, when I navigate to localhost:5000, this error is reported
https://docs.angularjs.org/error/$injector/modulerr?p0=AngularFlask&p1=%5B$injector:unpr%5D%20http:%2F%2Ferrors.angularjs.org%2F1.5.7%2F$injector%2Funpr%3Fp0%3D%2524routeProvider%0AO%2F%3C#https:%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.5.7%2Fangular.min.js:6:412%0Adb%2Fn.$injector%3C#https:%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.5.7%2Fangular.min.js:43:84%0Ad#https:%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.5.7%2Fangular.min.js:40:344%0Ae#https:%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.5.7%2Fangular.min.js:41:78%0Ah%2F%3C.invoke#https:%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.5.7%2Fangular.min.js:41:163%0Ad#https:%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.5.7%2Fangular.min.js:39:313%0Ag%2F%3C#https:%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.5.7%2Fangular.min.js:39:445%0Ar#https:%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.5.7%2Fangular.min.js:7:353%0Ag#https:%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.5.7%2Fangular.min.js:39:222%0Adb#https:%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.5.7%2Fangular.min.js:43:246%0ABc%2Fc#https:%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.5.7%2Fangular.min.js:20:359%0ABc#https:%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.5.7%2Fangular.min.js:21:163%0Age#https:%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.5.7%2Fangular.min.js:19:484%0A#https:%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.5.7%2Fangular.min.js:315:135%0An.Callbacks%2Fi#https:%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fjquery%2F1.12.4%2Fjquery.min.js:2:27444%0An.Callbacks%2Fj.fireWith#https:%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fjquery%2F1.12.4%2Fjquery.min.js:2:28213%0A.ready#https:%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fjquery%2F1.12.4%2Fjquery.min.js:2:30004%0AK#https:%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fjquery%2F1.12.4%2Fjquery.min.js:2:30366%0AO%2F%3C()%20angular.min.js:6g%2F%3C()%20angular.min.js:40r()%20angular.min.js:7g()%20angular.min.js:39db()%20angular.min.js:43Bc%2Fc()%20angular.min.js:20Bc()%20angular.min.js:21ge()%20angular.min.js:19%3Canonymous%3E%20angular.min.js:315n.Callbacks%2Fi()%20jquery.min.js:2n.Callbacks%2Fj.fireWith()%20jquery.min.js:2.ready()%20jquery.min.js:2K()%20jquery.min.js:21%20angular.min.js:6:412
It may be worth mentioning that if I use AngularJS 1.0.7 (included with Angular-Flask) the issue is cleared up until I add my html dev tag
<div dx-button="{
text: 'Generate random value'
}"></div>
then these are the errors:
Error: e.$$postDigest is not a function
Error: t.$root is undefined
Error: a.$watch is not a function
Error: c.$watch is not a function
Error: a.$watch is not a function
Error: t.dxTemplateModel is undefined
So this tells me that DevExpress is missing some functions in AngularJS 1.0.7; However, when using AngularJS 1.2.X Angular-Flask breaks. Is there anyway to get these two to play well together?
DevExtreme supports AngularJS 1.2 - 1.4. Your try to use too old version of AngularJS. Scripts in this repo were updated 3 years ago. But you can easily use another angularjs version. Your flask layout can look like below:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ title }} - My Flask Application</title>
<link rel="stylesheet" type="text/css" href="/static/content/site.css" />
<link rel="stylesheet" type="text/css" href="http://cdn3.devexpress.com/jslib/16.1.5/css/dx.common.css" />
<link rel="stylesheet" type="text/css" href="http://cdn3.devexpress.com/jslib/16.1.5/css/dx.light.css" />
</head>
<body class="dx-theme-generic-typography" ng-app="myApp">
<div ng-controller="defaultCtrl">
<div dx-button="buttonOptions"></div>
</div>
<script src="https://code.jquery.com/jquery-2.1.3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.16/angular.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.16/angular-sanitize.js"></script>
<script src="http://cdn3.devexpress.com/jslib/16.1.5/js/dx.all.js"></script>
<script src="/static/scripts/application.js"></script>
</body>
</html>
And the /static/scripts/application.js file:
var myApp = angular.module("myApp", ["dx"]);
myApp.controller("defaultCtrl", function($scope) {
$scope.buttonOptions = {
text: "My button",
onClick: function(){
alert("Hi!");
}
};
});

Categories

Resources