Re: Python and Cors

Deve Krehbiel <[email protected]> Sun, 27 Aug 2017 13:01:55 -0500
Newsgroups gmane.comp.python.twisted.web
Message-ID <CADfFrhS=gj7oULcsF+t8X6UWhM4QxN-uQxn3BJPM7LcQO40Abw@mail.gmail.com>
--===============3778224953352698036==
Content-Type: multipart/alternative; boundary="001a1140c55e4b2a030557bff98b"

--001a1140c55e4b2a030557bff98b
Content-Type: text/plain; charset="UTF-8"

This is what I get without your code:
index1.html:1 XMLHttpRequest cannot load
http://192.168.1.122:81/servos.rpy?value=70P. No
'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://192.168.1.122:9000' is therefore not allowed access.
jquery.min.js:4 XHR failed loading: GET "
http://192.168.1.122:81/servos.rpy?value=70P".

This is what I get with it:
jquery.min.js:4 GET http://192.168.1.122:81/servos.rpy?value=100P
send @ jquery.min.js:4
ajax @ jquery.min.js:4
r.(anonymous function) @ jquery.min.js:4
move @ index1.html:54
onclick @ index1.html:17
index1.html:1 XMLHttpRequest cannot load
http://192.168.1.122:81/servos.rpy?value=100P. No
'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://192.168.1.122:9000' is therefore not allowed access. *The
response had HTTP status code 500.*
jquery.min.js:4 XHR failed loading: GET "
http://192.168.1.122:81/servos.rpy?value=100P".

I appreciate your efforts and if you have any other ideas... Thank You!

Deve

On Sun, Aug 27, 2017 at 12:48 PM, Deve Krehbiel <[email protected]> wrote:

> Thank you for the response. In trying that code, it made it so the LAN
> cannot move the buttons either. Here is the error list I got:
>
> *web.Server Traceback (most recent call last):*
> exceptions.NameError: global name 'origin' is not defined
> /usr/lib/python2.7/dist-packages/twisted/web/server.py:189 in process
> 188                    self._encoder = encoder
> 189            self.render(resrc)
> 190        except:
> /usr/lib/python2.7/dist-packages/twisted/web/server.py:238 in render
> 237        try:
> 238            body = resrc.render(self)
> 239        except UnsupportedMethod as e:
> /usr/lib/python2.7/dist-packages/twisted/web/resource.py:250 in render
> 249            raise UnsupportedMethod(allowedMethods)
> 250        return m(request)
> 251
> /usr/local/www/servos.rpy:15 in render_GET
> 14    def render_GET(self,request):
> 15        if origin in (self.permitted_origins):
> 16            request.setHeader('Access-Control-Allow-Origin', origin)
> exceptions.NameError: global name 'origin' is not defined
>
> Deve
>
> On Sun, Aug 27, 2017 at 12:03 PM, Donal McMullan <[email protected]
> > wrote:
>
>> Perhaps you just need to set the 'Access-Control-Allow-Origin' header?
>> Something like this might work:
>>
>>
>> # Import necessary files
>>
>> import serial
>>
>> from twisted.web.resource import Resource
>>
>> # Setup Arduino at correct speed
>>
>> try:
>>
>>     arduino = serial.Serial('/dev/ttyACM0', 9600)
>>
>> except:
>>
>>     arduino = serial.Serial('/dev/ttyACM1', 9600)
>>
>>
>>
>> class MoveServo(Resource):
>>
>>     isLeaf = True
>>
>>     permitted_origins = ('http://192.168.1.122:9000',)
>>
>>
>>
>>     def render_GET(self,request):
>>
>>         if origin in (self.permitted_origins):
>>
>>             request.setHeader('Access-Control-Allow-Origin', origin)
>>
>>         try:
>>
>>             # Send value over serial to the Arduino
>>
>>             arduino.write(request.args['value'][0])
>>
>>             return 'Success'
>>
>>         except:
>>
>>             return 'Failure'
>>
>>
>>
>> resource = MoveServo()
>>
>> On 27 August 2017 at 17:10, Deve Krehbiel <[email protected]> wrote:
>>
>>> First post so forgive me if I am not explaining this right.
>>>
>>> I am trying to make a baby cam and then heavily document it for everyone
>>> to have access to. I am using a Raspberry Pi with Rasbian. I am using
>>> mjpg-streamer for the streaming with no problems.
>>>
>>> The problem is I am also using two servos for pan and tilt. To
>>> accomplish this I am using an Arduino Uno. This is so I can add IR lighting
>>> for night vision, etc later. I am not a programmer so this is getting
>>> frustrating after a few weeks of failure.
>>>
>>> How is it failing you might ask..well, its working perfectly with only
>>> ONE exception:
>>> Every time I push the button for left/right/up/down I get this:
>>>
>>> XMLHttpRequest cannot load http://192.168.1.122:81/servos.rpy?value=100P.
>>> No 'Access-Control-Allow-Origin' header is present on the requested
>>> resource. Origin 'http://192.168.1.122:9000' is therefore not allowed
>>> access.
>>>
>>> On the local area network, it still works, but taking it to the internet
>>> it does not.
>>>
>>> Here are the two programs that make this happen. One is servos.rpy and
>>> the other is the supporting HTML/Get script;
>>> ****
>>> servos.rpy
>>> -----------------------------------
>>> # Import necessary files
>>> import serial
>>> from twisted.web.resource import Resource
>>> # Setup Arduino at correct speed
>>> try:
>>>         arduino = serial.Serial('/dev/ttyACM0', 9600)
>>> except:
>>>         arduino = serial.Serial('/dev/ttyACM1', 9600)
>>>
>>> class MoveServo(Resource):
>>>         isLeaf = True
>>>         def render_GET(self,request):
>>>                 try:
>>>                 # Send value over serial to the Arduino
>>>                         arduino.write(request.args['value'][0])
>>>                         return 'Success'
>>>                 except:
>>>                         return 'Failure'
>>>
>>> resource = MoveServo()
>>> ***
>>>
>>> Now for the HTML/Get script:
>>>
>>> **
>>> <!doctype html>
>>> <html>
>>> <head>
>>> <title>Make Use Of DIY Security Camera</title>
>>> <style type="text/css">
>>> #container {
>>> /* center the content */
>>> margin: 0 auto;
>>> text-align: center;
>>> }
>>> </style>
>>> </head>
>>> <body>
>>> <div id="container">
>>> <img src="/?action=stream" /><br>
>>> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jque
>>> ry.min.js"></script><br />
>>> <button onclick="servos.move('P', 10)">Left</button>
>>> <button onclick="servos.move('P', -10)">Right</button>
>>> <button onclick="servos.move('T', -10)">Down</button>
>>> <button onclick="servos.move('T', 10)">Up</button>
>>> </div>
>>> </body>
>>> <script>
>>> var servos;
>>> $( document ).ready(function() {
>>> servos = moveServos();
>>> });
>>> function moveServos() {
>>> // Store some settings, adjust to suit
>>> var panPos = 70,
>>> tiltPos = 90,
>>> tiltMax = 170,
>>> tiltMin = 45,
>>> panMax = 170,
>>> panMin = 20;
>>> return {
>>> move:function(servo, adjustment) {
>>> var value;
>>> if(servo == 'P') {
>>> if(!((panPos >= panMax && adjustment > 0) || (panPos <= panMin &&
>>> adjustment < 0))) {
>>> // Still within allowed range, "schedule" the movement
>>> panPos += adjustment;
>>> }
>>> value = panPos + 'P';
>>> }
>>> else if(servo == 'T') {
>>> if(!((tiltPos >= tiltMax && adjustment > 0) || (tiltPos <= tiltMin &&
>>> adjustment < 0))) {
>>> // Still within allowed range, "schedule" the movement
>>> tiltPos += adjustment;
>>> }
>>> value = tiltPos + 'T';
>>> }
>>> // Use AJAX to actually move the servo
>>> $.get('http://192.168.1.122:81/servos.rpy?value=' + value);
>>> },
>>> }
>>> }
>>> </script>
>>> </html>
>>>
>>> *****
>>> Twisted is started:  sudo twistd -n web -p 81 --path /usr/local/www/
>>>
>>> I would be forever grateful if someone could take a serious look at this
>>> and tell me where I am going wrong. Once this is fixed, I can start
>>> documenting the entire system for everyone. Thank you!
>>>
>>> Deve
>>>
>>> _______________________________________________
>>> Twisted-web mailing list
>>> [email protected]
>>> https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web
>>>
>>>
>>
>> _______________________________________________
>> Twisted-web mailing list
>> [email protected]
>> https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web
>>
>>
>

--001a1140c55e4b2a030557bff98b
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div>This is what I get without your code:</div><div>index=
1.html:1 XMLHttpRequest cannot load <a href=3D"http://192.168.1.122:81/serv=
os.rpy?value=3D70P">http://192.168.1.122:81/servos.rpy?value=3D70P</a>. No =
&#39;Access-Control-Allow-Origin&#39; header is present on the requested re=
source. Origin &#39;<a href=3D"http://192.168.1.122:9000">http://192.168.1.=
122:9000</a>&#39; is therefore not allowed access.</div><div>jquery.min.js:=
4 XHR failed loading: GET &quot;<a href=3D"http://192.168.1.122:81/servos.r=
py?value=3D70P">http://192.168.1.122:81/servos.rpy?value=3D70P</a>&quot;.</=
div><div><br></div><div>This is what I get with it:</div><div><div>jquery.m=
in.js:4 GET <a href=3D"http://192.168.1.122:81/servos.rpy?value=3D100P">htt=
p://192.168.1.122:81/servos.rpy?value=3D100P</a>=C2=A0</div><div>send @ jqu=
ery.min.js:4</div><div>ajax @ jquery.min.js:4</div><div>r.(anonymous functi=
on) @ jquery.min.js:4</div><div>move @ index1.html:54</div><div>onclick @ i=
ndex1.html:17</div><div>index1.html:1 XMLHttpRequest cannot load <a href=3D=
"http://192.168.1.122:81/servos.rpy?value=3D100P">http://192.168.1.122:81/s=
ervos.rpy?value=3D100P</a>. No &#39;Access-Control-Allow-Origin&#39; header=
 is present on the requested resource. Origin &#39;<a href=3D"http://192.16=
8.1.122:9000">http://192.168.1.122:9000</a>&#39; is therefore not allowed a=
ccess. <b>The response had HTTP status code 500.</b></div><div>jquery.min.j=
s:4 XHR failed loading: GET &quot;<a href=3D"http://192.168.1.122:81/servos=
.rpy?value=3D100P">http://192.168.1.122:81/servos.rpy?value=3D100P</a>&quot=
;.</div></div><div><br></div><div>I appreciate your efforts and if you have=
 any other ideas... Thank You!</div></div><div class=3D"gmail_extra"><br cl=
ear=3D"all"><div><div class=3D"gmail_signature" data-smartmail=3D"gmail_sig=
nature"><div dir=3D"ltr"><div><div dir=3D"ltr"><div>Deve</div></div></div><=
/div></div></div>
<br><div class=3D"gmail_quote">On Sun, Aug 27, 2017 at 12:48 PM, Deve Krehb=
iel <span dir=3D"ltr">&lt;<a href=3D"mailto:[email protected]" target=3D"=
_blank">[email protected]</a>&gt;</span> wrote:<br><blockquote class=3D"g=
mail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-l=
eft:1ex"><div dir=3D"ltr">Thank you for the response. In trying that code, =
it made it so the LAN cannot move the buttons either. Here is the error lis=
t I got:<div><br></div><div><b style=3D"color:rgb(0,0,0);font-family:&quot;=
Times New Roman&quot;;font-size:medium">web.Server Traceback (most recent c=
all last):</b><span style=3D"color:rgb(0,0,0);font-family:&quot;Times New R=
oman&quot;;font-size:medium"></span><div style=3D"font-family:Verdana,Arial=
,helvetica,sans-serif;color:rgb(0,0,0);font-size:medium"><div class=3D"m_83=
71283913762161110error" style=3D"color:red;font-weight:bold">exceptions.Nam=
eError:=C2=A0global name &#39;origin&#39; is not defined</div><div class=3D=
"m_8371283913762161110gmail-stackTrace"><div class=3D"m_8371283913762161110=
gmail-frame" style=3D"padding:1em;background-image:initial;background-posit=
ion:initial;background-size:initial;background-repeat:initial;background-or=
igin:initial;background-clip:initial;border-bottom:thin dashed black;border=
-top:thin dashed black"><div class=3D"m_8371283913762161110gmail-location">=
/usr/lib/python2.7/dist-<wbr>packages/twisted/web/server.<wbr>py:189=C2=A0i=
n=C2=A0<span class=3D"m_8371283913762161110gmail-function" style=3D"font-we=
ight:bold;font-family:&quot;Courier New&quot;,courier,monospace">process</s=
pan></div><div class=3D"m_8371283913762161110gmail-snippet" style=3D"margin=
-bottom:0.5em;margin-left:1em;background:rgb(255,255,221)"><div class=3D"m_=
8371283913762161110gmail-snippetLine"><span class=3D"m_8371283913762161110g=
mail-lineno">188</span>=C2=A0<code class=3D"m_8371283913762161110gmail-code=
">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self=
._encoder =3D encoder</code></div><div class=3D"m_8371283913762161110gmail-=
snippetHighlightLine" style=3D"color:red"><span class=3D"m_8371283913762161=
110gmail-lineno">189</span>=C2=A0<code class=3D"m_8371283913762161110gmail-=
code">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.render(resrc)</code></d=
iv><div class=3D"m_8371283913762161110gmail-snippetLine"><span class=3D"m_8=
371283913762161110gmail-lineno">190</span>=C2=A0<code class=3D"m_8371283913=
762161110gmail-code">=C2=A0 =C2=A0 =C2=A0 =C2=A0except:</code></div></div><=
/div><div class=3D"m_8371283913762161110gmail-frame" style=3D"padding:1em;b=
ackground-image:initial;background-position:initial;background-size:initial=
;background-repeat:initial;background-origin:initial;background-clip:initia=
l;border-bottom:thin dashed black"><div class=3D"m_8371283913762161110gmail=
-location">/usr/lib/python2.7/dist-<wbr>packages/twisted/web/server.<wbr>py=
:238=C2=A0in=C2=A0<span class=3D"m_8371283913762161110gmail-function" style=
=3D"font-weight:bold;font-family:&quot;Courier New&quot;,courier,monospace"=
>render</span></div><div class=3D"m_8371283913762161110gmail-snippet" style=
=3D"margin-bottom:0.5em;margin-left:1em;background:rgb(255,255,221)"><div c=
lass=3D"m_8371283913762161110gmail-snippetLine"><span class=3D"m_8371283913=
762161110gmail-lineno">237</span>=C2=A0<code class=3D"m_8371283913762161110=
gmail-code">=C2=A0 =C2=A0 =C2=A0 =C2=A0try:</code></div><div class=3D"m_837=
1283913762161110gmail-snippetHighlightLine" style=3D"color:red"><span class=
=3D"m_8371283913762161110gmail-lineno">238</span>=C2=A0<code class=3D"m_837=
1283913762161110gmail-code">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0body =
=3D resrc.render(self)</code></div><div class=3D"m_8371283913762161110gmail=
-snippetLine"><span class=3D"m_8371283913762161110gmail-lineno">239</span>=
=C2=A0<code class=3D"m_8371283913762161110gmail-code">=C2=A0 =C2=A0 =C2=A0 =
=C2=A0except UnsupportedMethod as e:</code></div></div></div><div class=3D"=
m_8371283913762161110gmail-frame" style=3D"padding:1em;background-image:ini=
tial;background-position:initial;background-size:initial;background-repeat:=
initial;background-origin:initial;background-clip:initial;border-bottom:thi=
n dashed black"><div class=3D"m_8371283913762161110gmail-location">/usr/lib=
/python2.7/dist-<wbr>packages/twisted/web/resource.<wbr>py:250=C2=A0in=C2=
=A0<span class=3D"m_8371283913762161110gmail-function" style=3D"font-weight=
:bold;font-family:&quot;Courier New&quot;,courier,monospace">render</span><=
/div><div class=3D"m_8371283913762161110gmail-snippet" style=3D"margin-bott=
om:0.5em;margin-left:1em;background:rgb(255,255,221)"><div class=3D"m_83712=
83913762161110gmail-snippetLine"><span class=3D"m_8371283913762161110gmail-=
lineno">249</span>=C2=A0<code class=3D"m_8371283913762161110gmail-code">=C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0raise UnsupportedMethod(<wbr>allowedM=
ethods)</code></div><div class=3D"m_8371283913762161110gmail-snippetHighlig=
htLine" style=3D"color:red"><span class=3D"m_8371283913762161110gmail-linen=
o">250</span>=C2=A0<code class=3D"m_8371283913762161110gmail-code">=C2=A0 =
=C2=A0 =C2=A0 =C2=A0return m(request)</code></div><div class=3D"m_837128391=
3762161110gmail-snippetLine"><span class=3D"m_8371283913762161110gmail-line=
no">251</span><code class=3D"m_8371283913762161110gmail-code"></code></div>=
</div></div><div class=3D"m_8371283913762161110gmail-frame" style=3D"paddin=
g:1em;background-image:initial;background-position:initial;background-size:=
initial;background-repeat:initial;background-origin:initial;background-clip=
:initial;border-bottom:thin dashed black"><div class=3D"m_83712839137621611=
10gmail-location">/usr/local/www/servos.rpy:15=C2=A0<wbr>in=C2=A0<span clas=
s=3D"m_8371283913762161110gmail-function" style=3D"font-weight:bold;font-fa=
mily:&quot;Courier New&quot;,courier,monospace">render_GET</span></div><div=
 class=3D"m_8371283913762161110gmail-snippet" style=3D"margin-bottom:0.5em;=
margin-left:1em;background:rgb(255,255,221)"><div class=3D"m_83712839137621=
61110gmail-snippetLine"><span class=3D"m_8371283913762161110gmail-lineno">1=
4</span>=C2=A0<code class=3D"m_8371283913762161110gmail-code">=C2=A0 =C2=A0=
def render_GET(self,request):</code></div><div class=3D"m_83712839137621611=
10gmail-snippetHighlightLine" style=3D"color:red"><span class=3D"m_83712839=
13762161110gmail-lineno">15</span>=C2=A0<code class=3D"m_837128391376216111=
0gmail-code">=C2=A0 =C2=A0 =C2=A0 =C2=A0if origin in (self.permitted_origin=
s):</code></div><div class=3D"m_8371283913762161110gmail-snippetLine"><span=
 class=3D"m_8371283913762161110gmail-lineno">16</span>=C2=A0<code class=3D"=
m_8371283913762161110gmail-code">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0r=
equest.setHeader(&#39;Access-<wbr>Control-Allow-Origin&#39;, origin)</code>=
</div></div></div></div><div class=3D"m_8371283913762161110error" style=3D"=
color:red;font-weight:bold">exceptions.NameError:=C2=A0global name &#39;ori=
gin&#39; is not defined</div></div></div></div><div class=3D"gmail_extra"><=
span class=3D"HOEnZb"><font color=3D"#888888"><br clear=3D"all"><div><div c=
lass=3D"m_8371283913762161110gmail_signature" data-smartmail=3D"gmail_signa=
ture"><div dir=3D"ltr"><div><div dir=3D"ltr"><div>Deve</div></div></div></d=
iv></div></div></font></span><div><div class=3D"h5">
<br><div class=3D"gmail_quote">On Sun, Aug 27, 2017 at 12:03 PM, Donal McMu=
llan <span dir=3D"ltr">&lt;<a href=3D"mailto:[email protected]" targ=
et=3D"_blank">[email protected]</a>&gt;</span> wrote:<br><blockquote=
 class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc soli=
d;padding-left:1ex"><div dir=3D"ltr"><div>Perhaps you just need to set the =
&#39;Access-Control-Allow-Origin&#39; header? Something like this might wor=
k:</div><span><div><br></div><div><br></div><div># Import necessary files =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</div><div>import serial =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0=C2=A0</div><div>from twisted.web.resource import Resource =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0</div><div># Setu=
p Arduino at correct speed =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</div><div>try: =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</div><div>=C2=A0 =C2=A0 arduino =3D serial.=
Serial(&#39;/dev/ttyACM0&#39;, 9600) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0</d=
iv><div>except: =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0</div><div>=C2=A0 =C2=A0=
 arduino =3D serial.Serial(&#39;/dev/ttyACM1&#39;, 9600) =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0=C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0=C2=A0</div><div>class MoveServo(Resource): =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0</div><div>=C2=A0 =C2=A0 isLeaf =3D True =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0</div></sp=
an><div>=C2=A0 =C2=A0 permitted_origins =3D (&#39;<a href=3D"http://192.168=
.1.122:9000" target=3D"_blank">http://192.168.1.122:9000</a>&#39;,) =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0=C2=A0</div><div>=C2=A0 =C2=A0 def render_GET(self,request): =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0=C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 if origin in (self.permi=
tted_origins): =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</div><div>=C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 request.setHeader(&#39;Access-Cont<w=
br>rol-Allow-Origin&#39;, origin) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
</div><span><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 try: =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</div><di=
v>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 # Send value over serial to the=
 Arduino =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 arduino.write(request.args[&#39;va<wbr>lue&#39;][0]) =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0=C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 return &#39;Success&#39; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</div><div>=C2=
=A0 =C2=A0 =C2=A0 =C2=A0 except: =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 return &#39;Failure&#39; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
=C2=A0</div><div>resource =3D MoveServo()=C2=A0</div></span></div><div clas=
s=3D"gmail_extra"><br><div class=3D"gmail_quote"><div><div class=3D"m_83712=
83913762161110h5">On 27 August 2017 at 17:10, Deve Krehbiel <span dir=3D"lt=
r">&lt;<a href=3D"mailto:[email protected]" target=3D"_blank">deve@speedp=
rint.com</a>&gt;</span> wrote:<br></div></div><blockquote class=3D"gmail_qu=
ote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex=
"><div><div class=3D"m_8371283913762161110h5"><div dir=3D"ltr">First post s=
o forgive me if I am not explaining this right.=C2=A0<div><br></div><div>I =
am trying to make a baby cam and then heavily document it for everyone to h=
ave access to. I am using a Raspberry Pi with Rasbian. I am using mjpg-stre=
amer for the streaming with no problems.=C2=A0</div><div><br></div><div>The=
 problem is I am also using two servos for pan and tilt. To accomplish this=
 I am using an Arduino Uno. This is so I can add IR lighting for night visi=
on, etc later. I am not a programmer so this is getting frustrating after a=
 few weeks of failure.</div><div><br></div><div>How is it failing you might=
 ask..well, its working perfectly with only ONE exception:</div><div>Every =
time I push the button for left/right/up/down I get this:</div><div><br></d=
iv><div>XMLHttpRequest cannot load <a href=3D"http://192.168.1.122:81/servo=
s.rpy?value=3D100P" target=3D"_blank">http://192.168.1.122:81/servos<wbr>.r=
py?value=3D100P</a>. No &#39;Access-Control-Allow-Origin&#39; header is pre=
sent on the requested resource. Origin &#39;<a href=3D"http://192.168.1.122=
:9000" target=3D"_blank">http://192.168.1.122:9000</a>&#39; is therefore no=
t allowed access.</div><div><br></div><div>On the local area network, it st=
ill works, but taking it to the internet it does not.</div><div><br></div><=
div>Here are the two programs that make this happen. One is servos.rpy and =
the other is the supporting HTML/Get script;</div><div>****</div><div>servo=
s.rpy</div><div>------------------------------<wbr>-----</div><div><div># I=
mport necessary files</div><div>import serial</div><div>from twisted.web.re=
source import Resource</div><div># Setup Arduino at correct speed</div><div=
>try:</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 arduino =3D serial.Serial(&#39;=
/dev/ttyACM0&#39;, 9600)</div><div>except:</div><div>=C2=A0 =C2=A0 =C2=A0 =
=C2=A0 arduino =3D serial.Serial(&#39;/dev/ttyACM1&#39;, 9600)</div><div><b=
r></div><div>class MoveServo(Resource):</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 isLeaf =3D True</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 def render_GET(se=
lf,request):</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 try:</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
<span style=3D"white-space:pre-wrap">		</span># Send value over serial to t=
he Arduino</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 arduino.write(request.args[&#39;va<wbr>lue&=
#39;][0])</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return &#39;Success&#39;</div><div>=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 except:</div><div>=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 r=
eturn &#39;Failure&#39;</div><div><br></div><div>resource =3D MoveServo()</=
div></div><div>***</div><div><br></div><div>Now for the HTML/Get script:</d=
iv><div><br></div><div>**</div><div><div>&lt;!doctype html&gt;</div><div>&l=
t;html&gt;</div><div><span style=3D"white-space:pre-wrap">	</span>&lt;head&=
gt;</div><div><span style=3D"white-space:pre-wrap">		</span>&lt;title&gt;Ma=
ke Use Of DIY Security Camera&lt;/title&gt;</div><div><span style=3D"white-=
space:pre-wrap">		</span>&lt;style type=3D&quot;text/css&quot;&gt;</div><di=
v><span style=3D"white-space:pre-wrap">			</span>#container {</div><div><sp=
an style=3D"white-space:pre-wrap">				</span>/* center the content */</div>=
<div><span style=3D"white-space:pre-wrap">				</span>margin: 0 auto;<span s=
tyle=3D"white-space:pre-wrap">	</span></div><div><span style=3D"white-space=
:pre-wrap">				</span>text-align: center;</div><div><span style=3D"white-sp=
ace:pre-wrap">			</span>}</div><div><span style=3D"white-space:pre-wrap">		=
</span>&lt;/style&gt;</div><div><span style=3D"white-space:pre-wrap">	</spa=
n>&lt;/head&gt;</div><div><span style=3D"white-space:pre-wrap">	</span>&lt;=
body&gt;</div><div><span style=3D"white-space:pre-wrap">		</span>&lt;div id=
=3D&quot;container&quot;&gt;</div><div><span style=3D"white-space:pre-wrap"=
>			</span>&lt;img src=3D&quot;/?action=3Dstream&quot; /&gt;&lt;br&gt;</div=
><div><span style=3D"white-space:pre-wrap">			</span>&lt;script src=3D&quot=
;<a href=3D"https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.j=
s" target=3D"_blank">https://ajax.googleapis.c<wbr>om/ajax/libs/jquery/3.1.=
0/jque<wbr>ry.min.js</a>&quot;&gt;&lt;/script&gt;&lt;br /&gt;</div><div><sp=
an style=3D"white-space:pre-wrap">			</span>&lt;button onclick=3D&quot;serv=
os.move(&#39;P&#39;, 10)&quot;&gt;Left&lt;/button&gt;</div><div><span style=
=3D"white-space:pre-wrap">			</span>&lt;button onclick=3D&quot;servos.move(=
&#39;P&#39;, -10)&quot;&gt;Right&lt;/button&gt;</div><div><span style=3D"wh=
ite-space:pre-wrap">			</span>&lt;button onclick=3D&quot;servos.move(&#39;T=
&#39;, -10)&quot;&gt;Down&lt;/button&gt;</div><div><span style=3D"white-spa=
ce:pre-wrap">			</span>&lt;button onclick=3D&quot;servos.move(&#39;T&#39;, =
10)&quot;&gt;Up&lt;/button&gt;</div><div><span style=3D"white-space:pre-wra=
p">		</span>&lt;/div&gt;</div><div><span style=3D"white-space:pre-wrap">	</=
span>&lt;/body&gt;</div><div><span style=3D"white-space:pre-wrap">	</span>&=
lt;script&gt;</div><div><span style=3D"white-space:pre-wrap">		</span>var s=
ervos;</div><div><span style=3D"white-space:pre-wrap">		</span>$( document =
).ready(function() {</div><div><span style=3D"white-space:pre-wrap">			</sp=
an>servos =3D moveServos();</div><div><span style=3D"white-space:pre-wrap">=
		</span>});</div><div><span style=3D"white-space:pre-wrap">		</span>functi=
on moveServos() {</div><div><span style=3D"white-space:pre-wrap">			</span>=
// Store some settings, adjust to suit</div><div><span style=3D"white-space=
:pre-wrap">			</span>var panPos =3D 70,=C2=A0</div><div><span style=3D"whit=
e-space:pre-wrap">				</span>tiltPos =3D 90,=C2=A0</div><div><span style=3D=
"white-space:pre-wrap">				</span>tiltMax =3D 170,=C2=A0</div><div><span st=
yle=3D"white-space:pre-wrap">				</span>tiltMin =3D 45,=C2=A0</div><div><sp=
an style=3D"white-space:pre-wrap">				</span>panMax =3D 170,=C2=A0</div><di=
v><span style=3D"white-space:pre-wrap">				</span>panMin =3D 20;</div><div>=
<span style=3D"white-space:pre-wrap">			</span>return {</div><div><span sty=
le=3D"white-space:pre-wrap">				</span>move:function(servo, adjustment) {</=
div><div><span style=3D"white-space:pre-wrap">					</span>var value;</div><=
div><span style=3D"white-space:pre-wrap">					</span>if(servo =3D=3D &#39;P=
&#39;) {</div><div><span style=3D"white-space:pre-wrap">						</span>if(!((=
panPos &gt;=3D panMax &amp;&amp; adjustment &gt; 0) || (panPos &lt;=3D panM=
in &amp;&amp; adjustment &lt; 0))) {</div><div><span style=3D"white-space:p=
re-wrap">							</span>// Still within allowed range, &quot;schedule&quot; =
the movement</div><div><span style=3D"white-space:pre-wrap">							</span>p=
anPos +=3D adjustment;</div><div><span style=3D"white-space:pre-wrap">					=
	</span>}</div><div><span style=3D"white-space:pre-wrap">						</span>value=
 =3D panPos + &#39;P&#39;;</div><div><span style=3D"white-space:pre-wrap">	=
				</span>}</div><div><span style=3D"white-space:pre-wrap">					</span>els=
e if(servo =3D=3D &#39;T&#39;) {</div><div><span style=3D"white-space:pre-w=
rap">						</span>if(!((tiltPos &gt;=3D tiltMax &amp;&amp; adjustment &gt; =
0) || (tiltPos &lt;=3D tiltMin &amp;&amp; adjustment &lt; 0))) {</div><div>=
<span style=3D"white-space:pre-wrap">							</span>// Still within allowed =
range, &quot;schedule&quot; the movement</div><div><span style=3D"white-spa=
ce:pre-wrap">							</span>tiltPos +=3D adjustment;</div><div><span style=
=3D"white-space:pre-wrap">						</span>}</div><div><span style=3D"white-spa=
ce:pre-wrap">						</span>value =3D tiltPos + &#39;T&#39;;</div><div><span =
style=3D"white-space:pre-wrap">					</span>}</div><div><span style=3D"white=
-space:pre-wrap">					</span>// Use AJAX to actually move the servo</div><d=
iv><span style=3D"white-space:pre-wrap">					</span>$.get(&#39;<a href=3D"h=
ttp://192.168.1.122:81/servos.rpy?value=3D" target=3D"_blank">http://192.16=
8.1.122:81<wbr>/servos.rpy?value=3D</a>&#39; + value);</div><div><span styl=
e=3D"white-space:pre-wrap">				</span>},</div><div><span style=3D"white-spa=
ce:pre-wrap">			</span>}</div><div><span style=3D"white-space:pre-wrap">		<=
/span>}</div><div><span style=3D"white-space:pre-wrap">	</span>&lt;/script&=
gt;</div><div>&lt;/html&gt;</div></div><div><br></div><div>*****</div><div>=
Twisted is started: =C2=A0sudo twistd -n web -p 81 --path /usr/local/www/</=
div><div><br></div><div>I would be forever grateful if someone could take a=
 serious look at this and tell me where I am going wrong. Once this is fixe=
d, I can start documenting the entire system for everyone. Thank you!</div>=
<span class=3D"m_8371283913762161110m_-4865426837896638325HOEnZb"><font col=
or=3D"#888888"><div><br clear=3D"all"><div><div class=3D"m_8371283913762161=
110m_-4865426837896638325m_-2487397493353888386gmail_signature"><div dir=3D=
"ltr"><div><div dir=3D"ltr"><div>Deve</div></div></div></div></div></div>
</div></font></span></div>
<br></div></div>______________________________<wbr>_________________<br>
Twisted-web mailing list<br>
<a href=3D"mailto:[email protected]" target=3D"_blank">Twisted-=
[email protected]</a><br>
<a href=3D"https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web" =
rel=3D"noreferrer" target=3D"_blank">https://twistedmatrix.com/cgi-<wbr>bin=
/mailman/listinfo/twisted-w<wbr>eb</a><br>
<br></blockquote></div><br></div>
<br>______________________________<wbr>_________________<br>
Twisted-web mailing list<br>
<a href=3D"mailto:[email protected]" target=3D"_blank">Twisted-=
[email protected]</a><br>
<a href=3D"https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web" =
rel=3D"noreferrer" target=3D"_blank">https://twistedmatrix.com/cgi-<wbr>bin=
/mailman/listinfo/twisted-w<wbr>eb</a><br>
<br></blockquote></div><br></div></div></div>
</blockquote></div><br></div>

--001a1140c55e4b2a030557bff98b--

--===============3778224953352698036==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: inline

X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KVHdpc3RlZC13
ZWIgbWFpbGluZyBsaXN0ClR3aXN0ZWQtd2ViQHR3aXN0ZWRtYXRyaXguY29tCmh0dHBzOi8vdHdp
c3RlZG1hdHJpeC5jb20vY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3R3aXN0ZWQtd2ViCg==

--===============3778224953352698036==--