https://blog.naver.com/pk3152/221358858486
1 //================================== 2 {{ 변수명 }} 3 {% 파이썬 소스코드 %} 4 {#주석 #} 5 6 {# 7 주석1 8 주석 2 9 ... 10 #} 11 //================================== 12 for문과 if문은코드가 끝이 났다는 것을 알려줘야 합니다. 13 for문 : {% endfor %} 14 if문 : {% endif %} 15 {% for i in range(10)%} 16 <div>jinja2 is great!!!</div> 17 {% endfor %} 18 19 {% if num == 1 %} 20 <h1>good</h1> 21 {% elif num == 2 %} 22 <h1>bad</h1> 23 {% else %} 24 <h1>not</h1> 25 {% endif %} 26 //=================================== 27 28 {{ 변수 | int }} #숫자 문자 타입 변환 방법 29 10이 넘는 경우에만 okay라는 문구를 출력하는 방법입니다. 30 <div> 31 {% if myNum|int > 10 %} 32 <span>Okay</span> 33 {% endif %} 34 </div> 35 36 {{ 변수 | str }} #문자 변환 예제 37 myNum 변수가 1000을 넘은 경우에 해당하는 값을 화면에 문구와 함께 출력 38 <div> 39 {% if muNum > 1000 %} 40 감사합니다. {{ myNum | str }}번째 방문하셨습니다. 41 {% endif %} 42 </div> 43 44 //===================================== 45 부모의 html을 물려받아 똑같이 사용할 수 있다. 46 자식템플릿에서 {% extends 상속받을 html이름 %} 47 48 전부 상속받는 것이 아니라,일부분을 수정하고 싶은 경우 49 block 블록이름 중간에 Space 50 {% block 블록이름 %} 51 소스코드 52 ... 53 {% endblock %} 54 55 {% extends 부모html %} 56 {% block 부모 템플릿의 블록이름 %} 57 변경하고자 하는 소스코드 58 ... 59 {% endblock %} 60 //====================================== 61 62 <link rel="stylesheet" type="text/css" href="{{url_for('static',filename='css/style.css')}}"> 63 <script type="text/javascript" src="{{url_for('static',filename='js/main.js')}}"></script> 64 <img src="{{url_for('static',filename='img/img1.jpg')}}"> 65 66 app.run(host="0.0.0.0",port=PORT,debug=True) 67 app.run(host="0.0.0.0",port=PORT) #有没有debug 都一样 没有调试信息 68 host="0.0.0.0" #这样可以通过输入IP 访问 69 port=PORT 随机端口
login 功能
1 //form.html 2 <html> 3 <head> 4 <title> form 태그로 로그인 만들었습니다. </title> 5 </head> 6 <body> 7 {% block main %} 8 <form method="POST" action="/login"> 9 <div>아이디: <input type="text" name="id" placeholder="아이디"> </div> 10 <div>비밀번호: <input type="password" name="password" placeholder="비밀번호"></div> 11 <input type="submit" value="로그인"> 12 </form> 13 <input type="submit" value="register" onclick="window.location.href='/register';return false;" > 14 {{text}} 15 {% endblock %} 16 </body> 17 </html>
1 //register.html 2 {% extends "form.html" %} 3 {% block main %} 4 <form action="/registering" method="post"> 5 <div> 아이디 : <input type="text" name="reg_id"></div> 6 <div> 비밀번호 :<input type="password" name="reg_pwd"></div> 7 <div> 닉네임 :<input type="text" name="reg_nick"></div> 8 <div class="div_3"><div> <input type="submit" class="button"> </div></div> 9 </form> 10 {% endblock %}
python
1 from flask import render_template,request,url_for,redirect 2 3 lists_id=[] #保存ID 4 lists_pwd=[]#保存密码 5 lists_nick=[] #保存网名 6 text="" 7 8 @app.route('/') 9 def main(): 10 return render_template("form.html",text=text)#显示默认地址 11 12 @app.route("/register") #接受 register请求 13 def register(): 14 return render_template("register.html") #显示register.html 15 16 @app.route("/registering",methods=["POST"]) #注册 17 def registering(): 18 id=request.form["reg_id"] #post里获得字段 19 pwd=request.form["reg_pwd"] 20 nick=request.form["reg_nick"] 21 22 lists_id.append(id) #添加列表里 23 lists_nick.append(nick) 24 lists_pwd.append(pwd) 25 return redirect("/") #跳转到首页 26 27 @app.route("/login",methods=["POST"]) 28 def login(): 29 global text 30 id=request.form["id"] 31 pwd=request.form["password"] 32 33 for i in range(len(lists_id)):#遍历查询 34 if(id==lists_id[i]): #ID 一样 35 if(pwd==lists_pwd[i]): #密码一样 36 return lists_nick[i]+"님이 접속하였습니다!!" 37 else: 38 text="비밀번호 오류" 39 return redirect("/") 40 text="아이디가 없습니다" #如果没有值 41 return redirect("/")
1 Flask 서버 예제 : 2 1. py 파일을 만든다. 3 파일명 : 파일명 : flask_server.py 4 5 2. 코딩 6 from flask import Flask 7 app = Flask(__name__) 8 9 @app.route("/") 10 def hello(): 11 return "Hello World!" 12 13 if __name__ == "__main__": 14 app.run(host='192.168.0.1', port=9999, debug=True) #아이피주소, 포트주소 15 16 3. 실행 17 1. 라즈베리파이에 설치되어있는 Thonny로 실행 18 2. 터미널에서 python ./flask_server.py 19 바탕화면에 저장시[cd home/pi/Desktop/해당 폴더] 20 21 Flask +Jinja2 서버 예제 : 22 23 1. py 파일을 만든다. 24 파일명 : 파일명 : flaskJinja_server.py 25 26 2. flaskJinja_server.py 코딩 27 from flask import Flask,render_template 28 import datetime 29 app = Flask(__name__) 30 @app.route("/") 31 def gettime(): 32 localtime = datetime.datetime.now() 33 strTimes = localtime.strftime("%Y-%m-%d %H:%M") 34 templateData = { 35 'title' : 'localtime', 36 'time' : strTimes 37 } 38 return render_template('main.html', **templateData) 39 40 if __name__ == "__main__": 41 app.run(host='0.0.0.0', port=8888, debug=True) #아이피주소, 포트주소 42 43 3.templates폴더에 html 파일을 만든다. 44 파일명 : 파일명 : main.html 45 46 <html> 47 <head> 48 <title>{{title}}</title> 49 </head> 50 51 <body> 52 <p>LocalTime : </p> 53 <p>{{time}}</p> 54 </body> 55 56 4. 실행 57 1-2. 라즈베리파이에 설치되어있는 Thonny로 실행 58 1-2. 터미널에서 python ./flaskJinja_server.py 59 바탕화면에 저장시[cd home/pi/Desktop/해당 폴더] 60 61 3. 인터넷 익스플로러에서 localhost:8888
socket IO
1.安装 pip install flask-socketio
Python 代码 (没有namespace)
1 #https://jiayi.space/post/shi-yong-flask-socketiojin-xing-websockettong-xin 2 #https://www.cnblogs.com/franknihao/p/7550043.html 3 #pip install flask-socketio 4 5 #!/usr/bin/env python 6 from flask import Flask, render_template, session, request 7 from flask_socketio import SocketIO, emit 8 9 """ 10 未命名的事件使用send(),已经命名的事件用emit()。 11 发送事件时,如果把broadcast参数设为True,那么同一个namespace下的所有连接都会收到该事件 12 13 1.后端如何得到前端数据 14 1)如果前端提交的方法为POST: 15 后端接收时要写methods=[‘GET’,‘POST’] 16 xx=request.form.get(xx); 17 xx=request.form[’‘xx’] 18 2)如果是GET 19 xx=request.args.get(xx) 20 2.后端向前端传数据 21 1) 传单个数据` 22 return render_template(‘需要传参网址’,xx=u’ xx’); 23 前端接收: 24 {{xx}} 25 2) 传多个数据 26 先把数据写进字典,字典整体传 27 return render_template(‘需要传参网址’,**字典名’); 28 前端接收: 29 {{字典名.变量名}} 30 """ 31 app = Flask(__name__) 32 app.config['SECRET_KEY'] = 'secret!' 33 34 socketio = SocketIO(app) 35 36 @app.route('/') 37 def index(): 38 return render_template("index.html") 39 40 @socketio.on('py_connect') #对应socket.emit('py_connect', {data: 'connected!'});//发送消息 41 def py_conn_fun(msg):# 要连接所以首先执行 42 print("connected:"+msg['data']) 43 emit('js_response', {'data': msg['data']})#发消息到 javascript 对应js_response 接收 44 45 @socketio.on('py_data_string') #单个字符串 46 def my_fun_string(msg): 47 emit('js_response', {'data': 'is string'}) 48 49 @socketio.on('py_data_code') #多个字符串 50 def my_fun_code(msg): 51 emit('js_response',{'code':'200','data':'start to process...'}) 52 53 @socketio.on('py_data_list') #list 54 def my_fun_list(msg): 55 emit('js_response', {'data': msg['data']}) 56 57 @socketio.on('py_data_brodcast') #广播 打开两个页面 可以互相传递消息 58 def my_fun_brodcast(msg): 59 emit('js_response', {'data': msg['data']}, broadcast=True) 60 61 if __name__ == '__main__': 62 #socketio.run(app,host="0.0.0.0",port=6000)#手机无法访问 63 socketio.run(app,host="0.0.0.0")#手机可以访问
templates/index.html 文件
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <title>Flask-SocketIO Test</title> 5 <script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script> 6 <script type="text/javascript" src="https://cdn.bootcss.com/socket.io/1.5.1/socket.io.min.js"></script> 7 <script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script> 8 <script type="text/javascript" charset="utf-8"> 9 // 10 $(document).ready(function() { 11 var socket = io.connect();//建立连接 12 13 //接收消息 14 socket.on('connect', function() { 15 socket.emit('py_connect', {data: 'connected!'});//发送消息给python 16 }); 17 18 //msg参数传递 19 socket.on("js_response",function(msg){ 20 $('#log').append('<br>' + $('<div/>').text('Received #' + msg.code +': ' + msg.data).html()); 21 }); 22 23 //代码发送 24 $("#btn_code").click(function(){ 25 socket.emit('py_data_code', {data: $('#emit_data').val()}); 26 }); 27 28 //字符串 发送 29 $("#btn_string").click(function(){ 30 socket.emit('py_data_string', {data: $('#emit_data').val()}); 31 }); 32 33 //list 发送 34 $("#btn_list").click(function(){ 35 socket.emit('py_data_list', {data: $('#emit_data').val()}); 36 }); 37 38 //广播发送 浏览器打开两个页面 39 $("#btn_BrodCast").click(function(){ 40 socket.emit('py_data_brodcast', {data: $('#emit_data').val()}); 41 }); 42 }); 43 </script> 44 </head> 45 <body> 46 <input type="text" name="emit_data" id="emit_data" placeholder="Message"> 47 <input type="button" id="btn_code" value="提交code"> 48 <input type="button" id="btn_string" value="提交string"> 49 <input type="button" id="btn_list" value="提交list"> 50 <input type="button" id="btn_BrodCast" value="提交BrodCast"> 51 <div id='log'></div> 52 </body> 53 </html>