葡京网上娱乐场Apache2.4重新改默认根目录并部署虚拟域名

crud.js 内容

$(document).ready(function () {
    namespace='/websocket/user_refresh';
    var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port + namespace);
    $("#url_show").text("websocket URL: " + location.protocol + '//' + document.domain + ':' + location.port + namespace);

    socket.on('connect', function() { // 发送到服务器的通信内容
        socket.emit('connect_event', {data: '我已连接上服务端!'});
    });

    socket.on('server_response', function(msg) {
        \\ 显示接受到的通信内容,包括服务器端直接发送的内容和反馈给客户端的内容
        $('#log').append('<br>' + $('<div/>').text('接收 : ' + msg.data).html());
    });
    socket.on('user_response', function(msg) {
        //console.log(eval(msg.data[0]));
        //$('#users_show').append('<br>' + $('<div/>').text('接收 : ' + msg.data).html());
        var tbody = "";
        var obj = eval(msg.data[0]);
        $.each(obj, function (n, value) {
            var role = "";
            if (value.role===true){
                role = "管理员";
            }else {
                role = "一般用户";
            }
            var status = "";
            if (value.status===true){
                status = "正常";
            }else {
                status = "注销";
            }
            edit_url = "<a href=" +  location.protocol + '//' + document.domain + ':' + location.port + "/crud/websocket-edit/" + value.id + "> 修改</a>";
            delete_url = "<a href=\"javascript:delete_user_" + value.id + "()\">删除</a>";
            var trs = "";
            trs += "<tr><th>" + (n+1) + "</th><td>" + value.username + "</td><td>" + value.email + "</td><td>" + role + "</td><td>" + status + "</td><td>" + edit_url + " | " + delete_url +"</td></tr>";
            tbody += trs;
        })
        $('#users_show').empty();
        $('#users_show').append(tbody);
    });
});

7.行使 curl – I 127.0.0.1 响应一些峰信息

手上蓝图的 views.py

# -*- coding:utf-8 -*-
__author__ = '东方鹗'
__blog__ = u'http://www.os373.cn'

from flask import render_template, redirect, request, current_app, url_for, flash, json
from . import crud
from ..models import User
from .forms import AddUserForm, DeleteUserForm, EditUserForm
from ..import db
from threading import Lock
from app import socketio # 新加入的内容
from flask_socketio import emit # 新加入的内容

# 新加入的内容-开始
thread = None
thread_lock = Lock()

def background_thread(users_to_json):
    """Example of how to send server generated events to clients."""
    while True:
        socketio.sleep(5) \\ 每五秒发送一次

        socketio.emit('user_response', {'data': users_to_json}, namespace='/websocket/user_refresh')
# 新加入的内容-结束

@crud.route('/', methods=['GET', 'POST'])
def index():

    return render_template('index.html')


@crud.route('/websocket', methods=['GET', 'POST'])
def websocket():
    add_user_form = AddUserForm(prefix='add_user')
    delete_user_form = DeleteUserForm(prefix='delete_user')
    if add_user_form.validate_on_submit():
        if add_user_form.role.data == u'True':
            role = True
        else:
            role = False
        if add_user_form.status.data == u'True':
            status = True
        else:
            status = False
        u = User(username=add_user_form.username.data.strip(), email=add_user_form.email.data.strip(),
                 role=role, status=status)
        db.session.add(u)
        flash({'success': u'添加用户<%s>成功!' % add_user_form.username.data.strip()})
    if delete_user_form.validate_on_submit():
        u = User.query.get_or_404(int(delete_user_form.user_id.data.strip()))
        db.session.delete(u)
        flash({'success': u'删除用户<%s>成功!' % u.username})

    users = User.query.all()

    return render_template('websocket.html', users=users, addUserForm=add_user_form, deleteUserForm=delete_user_form)


@crud.route('/websocket-edit/<user_id>', methods=['GET', 'POST'])
def user_edit(user_id):
    user = User.query.get_or_404(user_id)
    edit_user_form = EditUserForm(prefix='edit_user', obj=user)
    if edit_user_form.validate_on_submit():
        user.username = edit_user_form.username.data.strip()
        user.email = edit_user_form.email.data.strip()
        if edit_user_form.role.data == u'True':
            user.role = True
        else:
            user.role = False
        if edit_user_form.status.data == u'True':
            user.status = True
        else:
            user.status = False
        flash({'success': u'用户资料已修改成功!'})
        return redirect(url_for('.basic'))

    return render_template('edit_websocket.html', editUserForm=edit_user_form, user=user)

# 新加入的内容-开始
@socketio.on('connect', namespace='/websocket/user_refresh')
def connect():
    """ 服务端自动发送通信请求 """
    global thread
    with thread_lock:
        users = User.query.all()
        users_to_json = [user.to_json() for user in users]

        if thread is None:
            thread = socketio.start_background_task(background_thread, (users_to_json, ))
    emit('server_response', {'data': '试图连接客户端!'})


@socketio.on('connect_event', namespace='/websocket/user_refresh')
def refresh_message(message):
    """ 服务端接受客户端发送的通信请求 """

    emit('server_response', {'data': message['data']})
# 新加入的内容-结束

———- 上述内容是后端的内容,以下内容是用是前段的情节 ———-

1.装置virtualbox网络也桥接网卡,启动Ubuntu。

修改 manage.py 内容

# -*- coding:utf-8 -*-
__author__ = '东方鹗'
__blog__ = u'http://www.os373.cn'

import os
from app import create_app, db, socketio
from app.models import User
from flask_script import Manager, Shell
from flask_migrate import Migrate, MigrateCommand


app = create_app(os.getenv('FLASK_CONFIG') or 'default')
manager = Manager(app=app)
migrate = Migrate(app=app, db=db)

def make_shell_context():
    return dict(app=app, db=db, User=User)


manager.add_command("shell", Shell(make_context=make_shell_context))
manager.add_command('db', MigrateCommand)
manager.add_command('run', socketio.run(app=app, host='0.0.0.0', port=5001)) # 新加入的内容


if __name__ == '__main__':
    manager.run()

1.virtualbox中安装Ubuntu 16.04-server

将 flask-socketio 引入项目

3.打开Xshell,新建连接。是可正常连接到Ubuntu中。

修改 app/__init__.py 内容

# -*- coding:utf-8 -*-
__author__ = '东方鹗'
__blog__ = u'http://www.os373.cn'

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import config
from flask_socketio import SocketIO # 新加入的内容
db = SQLAlchemy()

async_mode = None
socketio = SocketIO()


def create_app(config_name):
    """ 使用工厂函数初始化程序实例"""
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app=app)

    db.init_app(app=app)

    socketio.init_app(app=app, async_mode=async_mode) # 新加入的内容

    # 注册蓝本crud
    from .crud import crud as crud_blueprint
    app.register_blueprint(crud_blueprint, url_prefix='/crud')

    return app

2.应用ifconfig 命令查看ip,为192.168.1.104

Flask 作为一个全栈架构,如果你就会 python,而不明白 javascript
的前端知识,似乎是无能为力支撑起而的 web 梦想的,比如,一个简短的页面
一部分刷新 功能,你尽管用因此到 ajax 的学问,当然,你还好用 HTML5
的新特征 —— websocket功能,好于 flask 还提供了一个 flask-socketio
插件,本文我们便追究一下之 flask-scoketio插件的用法。

14.进入sites-enabled目录,cp 000-default.conf 
php-test.conf,复制一卖配置文件, 把000-default.conf中晓句都注释。sudo
vim php-test.conf, 。修改为:

设置插件

pip install flask-socketio

16.发端安装虚拟域名,打开windows的hosts文件,增加一行192.168.1.104 
www.test.cn  保存,访问www.test.cn 提示拒绝连接,在cmd中ping
www.test.cn虽然足分析192.168.1.104,但是接连超时。在Ubuntu中配置/etc/hosts
, 增加一行127.0.0.1  www.test.cn , 保存后,使用curl -I www.test.cn 
是得拜的。但不知怎么在windows用ip地址可以拜,使用虚拟域名却拒绝请求。

参考

  • 基于 flask 的 CRUD
    操作
  • WebSocket 教程 ——
    阮一峰

葡京网上娱乐场 1

花色布局

正文是当《基于 flask 的 CRUD
操作》的基本功及多了
webscoket 的效力,使用的凡 init_app() 的款型加载 flask-socketio
插件,和网上的多数科目稍有两样

flask-wtf-crud/
|-- env/
    |-- <python虚拟环境>
|-- app/ <项目的模块名称>
    |-- crud/ <前端蓝图>
        |-- __init__.py
        |-- views.py <路由和视图函数文件>
        |-- forms.py <表单类文件, wtforms插件必须项>
        |-- templates <HTML模板>
            |-- static <静态文件夹>
                |-- js <JavaScript 文件夹>
                    |-- crud.js # 异步请求的程序主要在此添加
    |-- XXXXXX/ <其它蓝图>
    |-- __init__.py
    |-- models.py <数据库模型文件>
|-- migrations/ <数据库表关系文件夹,Flask-Migrate迁移数据库时使用>
|-- config.py <项目的配置文件>
|-- manage.py <用于启动程序以及其它程序任务>

葡京网上娱乐场 2

使用 flask-socketio

6.apache2 -v 查看版本也2.4.18, 运行a2enmod
rewrite拉开apache重写模块(a2dismod关闭重写模块) 。

总结

  1. 由于 flask 架构具有上下文的限量,在数据库里 日增删改
    内容之时段,表格的内容没有生成——尽管有些就进展了刷新。要惦记展示变化后的数据库内容,必须得又启航一下
    flask 服务。
  2. 就是完整的配备以来,在 flask 项目里补充加 websocket
    协议,显得项目比重,实现一个部分刷新的效益要用 ajax 比较简单。
  3. 迎大侠能够被自家之种提出修改意见,先行感谢!!!

源码下载

5.sudo apt-get install apache2 安装

websocket 协议特性

  1. 立于 TCP 商量之上,服务器端的贯彻比较易于。
  2. 同 HTTP 协议抱有美妙的兼容性。默认端口也是80与443,并且握手阶段采取
    HTTP 协议,因此握手时不易于屏蔽,能经过各种 HTTP 代理服务器。
  3. 数码格式比较轻量,性能开销小,通信高效。
  4. 足发送文书,也得发送二上制数据。
  5. 没有同源限制,客户端可跟人身自由服务器通信。
  6. 商事标识符是ws(如果加密,则也wss),服务器网址就是 URL。

葡京网上娱乐场 3

理解 websocket 协议

  • HTTP 协议只能通过客户端发起呼吁来跟客户端进行报道 ——
    这是一个缺点。
  • 经过websocket
    协议,服务器可以主动向客户端推送信息,客户端也堪积极为服务器发送信息,是的确的双向平等对话,属于服务器推送技术之一模一样种。

13.下去修改网站根本目录。把上面修改的端口还原也80。在家目录下创造一个备作为根本目录的文本夹,例如:/home/jerry/php-test

来得结果

image

历次打开网页,会显示服务端发送的始末——“试图连接客户端!”,其后,客户端返回给服务端——“我早就连续上劳动端!”,而后又吃服务端返回给客户端展示。

以下的报表内容展示数据局里之情节,每 5 秒局部刷新一涂鸦表格内容。

服务器后端 log 日志内容如下:

image

4.然后sudo apt-cache search apache2 搜索是否出安包,

18.待使用virtualbox提供的端口转发功能,此功能就于NAT模式下利用。关闭虚拟机然后安排

8.以windows中开拓浏览器,使用192.168.1.104访,会打开apache2默认网站根目录/var/www/html里的index.html文件,简单介绍apache

软件条件:

19.改windows的hosts,
将第16条设置的192.168.1.104改变也127.0.0.1.保留后走访www.test.cn。可以正常打开index.html了。首先www.test.cn解析到127.0.0.1:80,virtualbox
再转发到虚拟机的80端口,即网站根本目录。xshell连接地址变为127.0.0.1:2222

葡京网上娱乐场 4

  1. sudo vim ports.conf , 可以修改apache监听端口,比如把80转吧8080

葡京网上娱乐场 5

20.老功告成

如上安装好后,

 

  1. service apache2 restart
    重启apache,在windows浏览器被走访192.168.1.104:8080,还是得打开上面的index.html。

15.保存php-test.conf并重启apache后,cp /var/www/html/index.html
/home/jerry/php-test/   , 
 在windows浏览器被做客192.168.1.104足以打开index.html页面

11.同时把
sites-enabled/000-default.conf中的葡京网上娱乐场 6中的80改为8080

葡京网上娱乐场 7

 

2.window7下安装Xshell5

9.上/etc/apache2目录下,apache2.conf是主配置文件,其中include了后的各个文件以及目录

17.
当网上查并屡次尝试,后总出:先关虚拟机,将virtualbox网络连接修改为NAT连接。打开虚拟机,ifconfig
发现ip地址变为10.0.2.15,此地点是虚拟机设置的,即使配置/etc/network/interfaces
为静态ip,/etc/init.d/networking restart重开网络为不克改变ip 。 
并且xshell也无法连接Ubuntu。