作者归档:kite

Django

django是如何处理一个请求的?

1.1 django根据setting中ROOT_URLCONF设置的值确定URLconf模块【路由文件】

1.2 加载路由模块并找到变量urlpatterens,变量中包含django.urls.path()或django.url.re_path()【正则匹配】实例

1.3 django依次匹配每个URL模式,一旦其中一个模式匹配,Django就会导入并调用给定的视图【一个python函数或基于类的视图】,路由给视图传递以下参数:

a. 一个HttpRequest实例
b. 如果匹配的URL模式未返回任务命名组,则正则表达式中的匹配将作为位置参数提供

1.4 如果没有URL模式匹配,或在此过程引发异常,Django将调用适当的错误处理视图,自定义处理错误视图需要在URLconf模块中配置以下变量并设置视图文件位置:

a. handler400
b. handler403
c. handler404
d. handler500

1.5 几个例子

from django.urls import path, include, re_path
from apps.message import views
from django.conf.urls import url
from apps.article.views import IndexView as ArticleView
from .settings import MEDIA_ROOT
from django.views.static import serve
import xadmin  # 后台项目

urlpatterns = [
    # 匹配空路由 加载页面首页,路由命名为home 路由命名后可在模板中调用
    path('', ArticleView.as_view(),name='home'),  # 基于类视图方法的调用
    
    # 匹配 'article'路由,并把路由分发到app URLconf配置中,使用django.urls.include加载app URLconf配置文件
    path('article/', include('apps.article.urls')),  # 加载子URLconf配置

    # goods/100 将会被匹配
    path('goods/<int:id>', views.goods),

    path('admin/', xadmin.site.urls),
    # 使用正则表达式 语法是(?P<name>Pattern) name为参数名称 Pattern是匹配模式
    re_path(r'^goods/(?P<id>[0-9]{4})/$', views.goods),
]

#要在路由中捕获参数需要使用尖括号<int:id>  int为匹配参数的类型 id为参数的名字,在视图文件中获取 views.goods(request,id)

# 定义错误页面
handler500 = views.err404

handler404 = views.err404

Python虚拟环境安装

1.安装virtualenv和virtualenvwrapper

为什么要安装虚拟环境?

python的包默认是安装在全局的,两个不同的项目可能需要不同版本的python或,如果安装在一起可能会导致问题发生。而虚拟环境可以隔离多个python版本工具,相互独立,互不影响。

pip intsall virtualenv 
pip install virtualenvwrapper-win  //windows下
pip install virtualenvwrapper  //linux
2.常用命令
mkvirtualenv *envName*  //创建一个虚拟环境 创建在用户家目录下
workenon *envName*  //激活环境
rmvirtualenv *envName* //删除环境
deactivate  //退出环境
worken //列出环境
3.安装虚拟环境的包

需要进入虚拟环境中,执行pip install即可

4.pycharm配置
File->settings->project interperter->project interperter中选择虚拟环境的python.exe文件即可

windows下安装Python3.7+Django2.1+Apache2.4

1.Python3.7安装

官网下载Python3.7的安装包,我的系统是64位,所以选择的64位安装包,自定义安装需要勾选为所有用户安装和加入环境变量。

2.安装Apache2.4

我这里安装的是Wamp3.1的集成环境,里面集成了Apache2.4,也是64位的,必须要和Python相对应,不然会导致Apache发生错误。

3.安装Django2.1和mysql客户端
pip intsall Django //安装最新的Django
pip install mysqlclient //安装mysql客户端
4.安装mod_wsgi
pip install mod_wsgi //安装mod_wsgi

安装成功后在python安装包下\Python37\Scripts下执行:

mod_wsgi-express module-config

执行此命令会输入三行内容:

LoadFile "d:/soft/python/python37/python37.dll"
LoadModule wsgi_module "d:/soft/python/python37/lib/site-packages/mod_wsgi/server/mod_wsgi.cp37-win_amd64.pyd"
WSGIPythonHome "d:/soft/python/python37"

将此内容拷贝备用。

5.配置Apache httpd.cnf

将第4步生成的三行内容拷贝到http.cof中,保存并重启Apache即可,内容如下:

#mod_wsgi设置
LoadFile "d:/soft/python/python37/python37.dll"
LoadModule wsgi_module "d:/soft/python/python37/lib/site-packages/mod_wsgi/server/mod_wsgi.cp37-win_amd64.pyd"
WSGIPythonHome "d:/soft/python/python37"
#指定项目的wsgi.py配置文件路径
WSGIScriptAlias / D:/wenjunting/python/app/app/wsgi.py
#指定项目路径
WSGIPythonPath  D:/wenjunting/python/app
#指定静态文件位置 ,给与访问权限
Alias /static/ D:/wenjunting/python/app/collectstatic/  #必须把admin模块的文件一同打包到此目录下
<Directory D:/wenjunting/python/app/collectstatic>
    Require all granted
</Directory>
<Directory D:/wenjunting/python/app/app>
<Files wsgi.py>
    Require all granted
</Files>
</Directory>

Lua数据类型

#!/usr/bin/lua

–使用type打印数据类型
–8种数据类型
–lua数据类型有 nil、boolean、number[双精度实浮点数]、string[一对单、双引号
]、function【c或lua编写的函数】、userdata【存储在变量中的C数据结构】、thread【执行的独立线路,用于协程】、table【类似关联数组】
a=2.1;
print(‘number:’..type(a)); –number

b=”this is string”;
print(type(b)) –string

string1 = [[
<p>使用双括号表示一串字符串</p>
]]
print(string1);

–使用#计算字符串长度
print(‘使用#计算字符串a的长度为:’..#b)

–数字字符串进行运算时会尝试把字符串转变为数字
print(‘数字字符串进行运算,会尝试将字符串转为数字:’..’21’+29)
print(‘function:’..type(print)); –function

print(‘nil:’..type(nil)); –nil

print(‘boolean:’..type(true)) –boolean

–删除table和全局变量使用nil进行赋值等同于删掉把他们删掉

–nil作比较时应该使用”nil”双引号 a=nil type(a)==”nill” true

table1 = {name=’joke’,sex=’男’,’21’}
print(‘table:’..type(table1)) –table

print(‘遍历table’);
for k,v in pairs(table1) do
print(k..’–‘..v)
end

–获取table某个键
print(table1.name);

–初始化table
table2 = {}
local table3 = {‘apple’,’pear’,’orange’} –直接初始化table 并声明为局部变>量
table3[4]=’grape’; –给某个索引赋值
–table未声明key 第一个索引是从1开始的
for k,v in pairs(table3) do

print(k..’–‘..v);
end
–function
function add(a,b)
if type(a)==”number” and type(b)==’number’ then
return a+b
else
return false
end
end

print(‘自定义加法函数,结果:’..add(4,6));
–函数可以存储在变量中
function1 = add
print(‘存储在变量中的函数调用:’..function1(10,2))
–简单的条件判断 if else
if nil or false then
print(‘不会进入执行此代码’)
else
print(‘因为nil和false都为false,会执行此逻辑’)
end

Lua基础语法

#!/usr/bin/lua  –指定lua的解释器

–print(‘hello word!’) 单行注释

–[[
print(‘多行注释’);
–]]
–定义变量,默认所有变量都是全局的,除非把变量声明为局部 关键字 local
a = 1
–获取一个不存在的变量 返回 nil 删除一个变量直接把变量声明为nil即可
print(‘变量a:’..a)

print(b) –返回nil

a=nil
print(a) –nil

Laravel 5.6 中优雅的管理 swoole 进程

1. 创建自定义artisan命令
php artisan make:command SwooleManger //默认在app/Console/Commans目录下创建SwooleManger.php文件。

    <?php
    namespace App\Console\Commands;    
    use Illuminate\Console\Command;
    use Illuminate\Support\Facades\App;
    class SwooleManger extends Command
    {
        private $server;

        private $pid_file;
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = 'swoole {action}';

        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = 'start or stop the swoole process';

        /**
         * Create a new command instance.
         *
         * @return void
         */
        public function __construct()
        {
            parent::__construct();
            $this->pid_file =  __DIR__.'/../../../storage/swoole_websocket.pid';
        }

        /**
         * Execute the console command.
         *
         * @return mixed
         */
        public function handle()
        {
            //获取传递的操作
            $arg = $this->argument('action');

            switch ($arg){
                case 'start':
                    //检测进程是否已开启
                    $pid = $this->getPid();
                    if($pid && \Swoole\Process::kill($pid,0))
                    {
                        $this->error("\r\nprocess already exist!\r\n");
                        exit;
                    }

                    $this->server = new \swoole_websocket_server("0.0.0.0", 9501);
                    $this->server->set([
                        'worker_num'=>8,
                        'daemonize' =>1,
                        'max_request'=>1000,
                        'dispatch_mode'=>2,
                        'pid_file' =>$this->pid_file,
                    ]);

                    //绑定操作类回调函数
                    $app = App::make('App\Handles\SwooleWebSocketHandle');

                    $this->server->on('open',array($app,'onOpen'));

                    $this->server->on('message',array($app,'onMessage'));

                    $this->server->on('close',array($app,'onClose'));

                    $this->info("\r\nprocess created successful!\r\n");

                    $this->server->start();
                    break;

                case 'stop':
                    if(!$pid = $this->getPid())
                    {
                        $this->error("\r\nprocess not started!\r\n");
                        exit;
                    }
                    if(\Swoole\Process::kill((int)$pid))
                    {
                        $this->info("\r\nprocess close successful!\r\n");
                        exit;
                    }
                    $this->info("\r\nprocess close failed!\r\n");
                    break;

                default:
                    $this->error("\r\noperation method does not exist!\r\n");
            }

        }

        //获取pid
        private function getPid()
        {
            return file_exists($this->pid_file) ? file_get_contents($this->pid_file) :false;
        }
    }

以上命令定义完成可使用artisan来管理swoole websocket服务的开启和关闭

php artisan swoole start  //开启
php artisan swoole stop //关闭

2.使用Handles类来处理swoole的事件处理

//在SwooleManger中使用了 
$app = App::make('App\Handles\SwooleWebSocketHandle'); //将SwooleWebsocketHandle注入到SwooleManger中

使用$this->server->on 注册事件回调函数,创建App\Handles\SwooleWebSocketHandle文件实现webSocket的事件即可

centos7安装mysql8.0

1.下载解压安装

wget http://ftp.iij.ad.jp/pub/db/mysql/Downloads/MySQL-8.0/mysql-8.0.12.tar.gz
 tar -xvf mysql-8.0.12.tar.gz

2.创建mysql用户和用户组

sudo groupadd mysql
sudo useradd -s /sbin/nologin -g mysql -r mysql  //不允许登录

3.编译安装

cd mysql-8.0.12
sudo cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DMYSQL_DATADIR=/data 
-DSYSCONFDIR=/usr/local/mysql/etc 
-DMYSQL_TCP_PORT=3306 
-DDOWNLOAD_BOOST=1 
-DWITH_BOOST=/usr/local/mysql-8.0.11/boost

make && make install

4. 初始化及修改目录权限

bin/mysqld --initialize --user=mysql --datadir=/data/mysql/
#执行初始化时会产生一个随机密码,需要拷贝【l(akwnBsb2kN】
bin/mysql_ssl_rsa_setup
chown -R mysql:mysql /usr/local/mysql
chown -R mysql:mysql /data/mysql
chmod 755 /usr/local/mysql -R
chmod 755 /data/mysql -R
#注意:配置文件中的pid文件和日志文件目录需要设置权限给mysql写入

5. 使用随机密码登录

sudo bin/mysqld_safe --user=mysql & 
bin/mysql -u root -p #登录后修改密码
alter user "root"@"localhost" identified by '123qwe4r';
#远程访问
use mysql;
update user set Host='%' where User='root';
flush privileges;

6. 连接报错

#这个错误出现的原因是在mysql8之前的版本中加密规则为mysql_native_password,而在mysql8以后的加密规则为caching_sha2_password。
#修改配置文件my.conf
default_authentication_plugin= mysql_native_password
#修改完重启mysql服务修改用户密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
#设置密码规则
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';  
#更新一下用户的密码 
FLUSH PRIVILEGES; #刷新权限

7. 拷贝启动文件

sudo cp /usr/lib/systemd/system/mysql.server /etc/init.d/mysqld
#systemctl管理mysql启动
sudo vim /usr/lib/system/system/mysql.service #加入以下内容
[Unit]
Description=redis-server
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/etc/init.d/mysqld start
ExecStop=/etc/init.d/mysqld stop
[Install]
WantedBy=multi-user.target

Ubuntu14 安装php Swoole扩展

1.安装扩展前的准备工作:

  • 1.1 安装php,版本必须大于5.3.10

sudo apt-get install php5.6  扩展根据使用情况安装

  • 1.2 安装gcc,ubuntu自带,一般不需要安装

sudo apt-get  build-dep gcc

  • 1.3 安装 autoconf

sudo apt-get autoconf

  • 1.4 安装git

sudo apt-get git

  • 1.5 安装pcre

sudo apt-get install libpcre3 libpcre3-dev

2.下载Swoole扩展源码编译

  • 2.1 创建目录下载源码

mkdir swoole

cd swoole

sudo git clone -b v1.10.5 https://github.com/swoole/swoole-src.git    #指定分支 1.10.5

  • 2.2 切换到源码目录执行编译

cd swoole-src/  #需要权限

phpize【可能不存在 需要安装sudo apt-get install php5-dev】

./configure

make

sudo make install

  • 2.3 配置php.ini文件

extension=swoole.io

  • 2.4 查看模块是否正常开启

通过phpinfo() 来查看是否成功加载了swoole

Java入门之包导入及Scanner、Random类的使用

#导入指定的类

import java.util.Scanner;
import java.util.Random;

#导入文件下的所有类

import java.util.*
/*
* Scanner包和Random包的基本用法以及包的导入方法
*/
class Demo{
public static void main(String[] args)
{
//测试
Scanner sc = new Scanner(System.in);

//获取int类型的命令行输入
//int i = sc.nextInt();

//获取String类型的命令行输入
String i = sc.next();

System.out.println(i);
//create random
Random ran = new Random();
//int类型的随机数 0-100 <100
int r = ran.nextInt(100);
//double类型的随机数 0-1 <1
//double r = ran.nextDouble();

System.out.println(r);

}
}

php中使用RabbitMq消息队列

1.RabbitMQ 是一个在AMQP基础上完成的,可复用的企业消息系统。消息队列中间件,支持多种语言,以及跨语言消息传递,安装配置文档请参照官网说明;

2. php中如何使用RabbitMQ呢?

2.1 安装php-amqp扩展,下载地址: http://pecl.php.net/package/amqp下载解压后文件如下图:将php_amqp.dll文件添加到php  ext扩展目录中并追加到php.ini文件中

2.2 使用的服务器为apache  需要将httpd.conf中添加一行 LoadFile  “rabbitmq.1.dll安装路径”;

2.3 重启apache,并查看phpinfo信息。只要看到amqp 字样即表示安装成功;

2.4 使用php-amqplib库来实现RabbitMQ消息队列的使用,使用composer 安装:composer.json 文件中require节点找那个添加 “php-amqplib/php-amqplib”:”>=2.6.1″

并执行composer update操作,或使用composer命令   composer require php-amqplib/php-amqplib来安装这个库。

2.5 可以参考github中的代码来实现具体需求 demo地址:https://github.com/php-amqplib/php-amqplib/tree/master/demo,下图两个demo为最基本的消息获取、应答和发送功能