在SQLAlchemy中使用SSL

时间:2018-02-12 09:05:32

标签: python mysql sqlalchemy

我最近改变了我的项目以使用SQLAlchemy并且我的项目运行良好,它使用了外部MySQL服务器。

现在我尝试使用SSL CA处理不同的MySQL服务器,但它没有连接。

(它确实使用MySQL Workbench连接,因此证书应该没问题)

我使用以下代码:

ssl_args = {'ssl': {'ca': ca_path}}
engine = create_engine("mysql+pymysql://<user>:<pass>@<addr>/<schema>",
                        connect_args=ssl_args)

我收到以下错误:

  

无法在&#39; \ addr \&#39;上连接到MySQL服务器([WinError 10054]远程主机强行关闭现有连接)

有什么建议吗?

4 个答案:

答案 0 :(得分:5)

我将DBAPI更改为MySQL-Connector,并使用以下代码:

ssl_args = {'ssl_ca': ca_path}
engine = create_engine("mysql+mysqlconnector://<user>:<pass>@<addr>/<schema>",
                        connect_args=ssl_args)

现在它有效。

答案 1 :(得分:0)

如果仅通过ssl连接从客户端计算机进行连接(因此您无权访问证书和密钥),则可以简单地将ssl = true添加到您的uri。

答案 2 :(得分:0)

另一种解决方案是使用sqlalchemy.engine.url.URL定义URL并将其传递给create_engine。

import { Component, OnInit } from "@angular/core";
import { NavController } from "@ionic/angular";
import { Observable, of, Subject, timer } from "rxjs";
import { delay, filter, switchMap, takeUntil, tap } from "rxjs/operators";

@Component({
  selector: "app-home",
  templateUrl: "./home.page.html",
  styleUrls: ["./home.page.scss"]
})
export class HomePage implements OnInit {
  private isInPage: boolean = true;
  private unsubscribe$: Subject<void> = new Subject<void>();

  constructor(private navCtrl: NavController) {}

  ngOnInit() {
    timer(0, 10000)
      .pipe(
        filter(() => this.isInPage),
        tap(currentTimer => {
          if (currentTimer === 0) {
            this.someFunctionToRunOnlyOnce();
          }
        }),
        switchMap(() => {
          return this.someAsynFunction();
        }),
        takeUntil(this.unsubscribe$)
      )
      .subscribe();
  }

  ionViewWillEnter() {
    this.isInPage = true;
  }

  ionViewWillLeave() {
    this.isInPage = false;
  }

  ngOnDestroy() {
    this.unsubscribe$.next();
    this.unsubscribe$.unsubscribe();
  }

  public openDetailsPage(): void {
    this.navCtrl.navigateForward("details");
  }

  private someAsynFunction(): Observable<number> {
    const randomNumber = Math.floor(Math.random() * 10000) + 1;

    console.log("==> Running someAsynFunction method");
    return of(randomNumber).pipe(delay(1000));
  }

  private someFunctionToRunOnlyOnce(): void {
    console.log("==> Running someAsynFunctionToRunOnlyOnce method");
  }
}

您可以在查询参数中包含SSL参数作为字典。

如果您使用Flask通过诸如SQLALCHEMY_DATABASE_URI之类的配置参数而不是直接使用create_engine来初始化SqlAlchemy引擎,则此方法很有用。

答案 3 :(得分:0)

官方 doc 有据可查:

import * as Flex from '@twilio/flex-ui';


 let mgr = Flex.Manager.getInstance()
     let roleName = mgr.workerClient.attributes.roles
    if( roleName.includes( 'admin')){
          flex.SideNav.Content.add(<OutboundSmsButton key="nav-outbound-sms-button"/>);
       }