python 사용시

certificate verify failed: unable to get local issuer certificate (_ssl.c:997)에러가 뜬다면 

 

터미널에 

ln -s /etc/ssl/* /Library/Frameworks/Python.framework/Versions/3.10/etc/openssl

입력하면됩니다.

3.10는 자신의 파이썬버전을 입력하세요

 

 

인터넷에 있는 ssl,certifi 설치하고 코드실행 다해도 안되서 올림

참고 :https://stackoverflow.com/questions/52805115/certificate-verify-failed-unable-to-get-local-issuer-certificate

반응형

'python' 카테고리의 다른 글

qr코드 대량 생성 및 하나의 이미지로 만들기  (0) 2022.12.19
postgres point type 변환  (2) 2022.09.19

Elastic Load Balancer을 사용하여 https 설정 후 

 

access로그에 계속 ELB-HealthChecker/2.0라고 떠서 다른로그를 볼수가없을때

 

 

 

ubuntu

cd /etc/nginx/sites-enabled/

nano 자신의 설정값 접속 

 

 

map $http_user_agent $ignore_ua {
default                 1;
"ELB-HealthChecker/2.0" 0;
}

server {
        client_max_body_size 0;
        listen 80;
        server_name 내아이피주소;

        location = /favicon.ico { access_log off; log_not_found off; }

        location / {
                access_log /자신경로/logs/nginx_access.log combined if=$ignore_ua;
                error_log  /자신경로/logs/nginx_error.log;

                include proxy_params;
                proxy_pass http://unix:/tmp/test.sock;
        }
}

 

 

sudo systemctl restart nginx

반응형

'python > fastapi' 카테고리의 다른 글

jwt access refresh token에 대한 정의  (0) 2022.09.07
sqlmodel create_all table생성 안될때  (0) 2022.08.31
[Errno 48] Address already in use  (0) 2022.08.29

필요 라이브러리 

qrcode -qr코드 생성

https://pypi.org/project/qrcode/

reportlab - 대량생성한 qr코드 이미지를 하나의 pdf 로 만들어줌

https://pypi.org/project/reportlab/

 

c = canvas.Canvas('/Users/thomas/Desktop/coupon/coupons.pdf')
y = 0
x = 0
for i in range(0, 100):
        uuid1 = shortuuid.uuid()
        qr = qrcode.QRCode(
            version=1,
            error_correction=qrcode.constants.ERROR_CORRECT_H,
            box_size=5,
            border=3,
        )
        qr.add_data(uuid1)
        qr.make(fit=True)
        img = qr.make_image(fill_color=(255, 126, 54), back_color="white").convert('RGB')
        
        # 중앙에 이미지 추가를 원할시 
        # face = Image.open('/Users/thomas/Desktop/images/Image.jpg')
        # face.thumbnail((60, 60))
        # pos = ((img.size[0] - face.size[0]) // 2, (img.size[1] - face.size[1]) // 2)
        #
        # img.paste(face, pos)
        
       	img.save(f"/Users/thomas/Desktop/coupon/qrcode-쿠폰{i}.png")
        
        x += 1
        if i % 10 == 0:
            y += 1
            x = 1
            
        c.drawImage(f'/Users/thomas/Desktop/coupon/qrcode-쿠폰{i}.png', x * 1.5 * cm, y * 1.5 * cm, 1.5 * cm,1.5 * cm)
        
        
c.showPage()
c.save()

포샵에서 열면 

 

참고:

https://stackoverflow.com/questions/26474277/grouping-images-to-one-image

반응형

db에 넣을때는 

SRID=4326;POINT(137.56276780042197 126.92813920924125)

ex)
location='SRID=4326;POINT(137.56276780042197 126.92813920924125)'

 

db에 있는 Point type은 불러오면 에러를 뱉는다 그러므로 처리를해줘야한다 

원인은 WKBElement 이놈 때문이다

 

1. 이방식으로 하면 response_model이 작동을 안함

stmt = select(Table).where(Table.id == trable_id)
travel = session.exec(stmt).one_or_none()

travel = jsonable_encoder(travel, custom_encoder={
    WKBElement: lambda
        location: f"{to_shape(location).x},{to_shape(location).y}"})

2.이방식으로 하면 잘받아온다 하지만 복잡한 구조로된 모델일경우 이마저 작동을 안한다

from geoalchemy2.shape import to_shape

class ModelRead(ModelBase):
    id: int
    create_at: datetime.datetime
    updated_at: datetime.datetime
    user_id: int
    location:str # point 받아오는 변수명
    
    @validator('location', pre=True, allow_reuse=True, whole=True, always=True)
    def correct_geom_format(cls, v):
        if not isinstance(v, WKBElement):
            raise ValueError('must be a valid WKBE element')
        return f"{to_shape(v).x},{to_shape(v).y}"

 

 

point타입이 위도,경도를 모두 포함하여 개꿀인줄 알았으나 쓰면 골치가 많이아프다..그래서 다시 나눠서쓴다..

 

 

 

 

 

참고:

https://stackoverflow.com/questions/66044397/how-to-create-a-sqlalchemy-class-attribute-from-a-calculated-field-in-sql-query

반응형

jwt란  JSON Web Token의 약자 

 

jwt는 header,payload,signature로 나눠져있는데

 

Header는 토큰의 타입과 해시 암호화 알고리즘으로 구성되어 있습니다. 첫째는 토큰의 유형 (JWT)을 나타내고, 두 번째는 HMAC, SHA256 또는 RSA와 같은 해시 알고리즘을 나타내는 부분입니다.

 

Payload는 토큰에 담을 클레임(claim) 정보를 포함하고 있습니다. Payload 에 담는 정보의 한 ‘조각’ 을 클레임이라고 부르고, 이는 name / value 의 한 쌍으로 이뤄져있습니다. 토큰에는 여러개의 클레임 들을 넣을 수 있습니다.
클레임의 정보는 등록된 (registered) 클레임, 공개 (public) 클레임, 비공개 (private) 클레임으로 세 종류가 있습니다.


Signature는 secret key를 포함하여 암호화되어 있습니다.

 

ex)

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NjM3NDA4MzgsImlhdCI6MTY2MjUzMTA1OCwic3ViIjoiMSJ9.6SFagZKjko3Lagm-js0ugxUuI823OBQA40nsTT1jsxg

 

.을 중심으로 header,payload,signature를 의미한다

header = eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

payload = eyJleHAiOjE2NjM3NDA4MzgsImlhdCI6MTY2MjUzMTA1OCwic3ViIjoiMSJ9

signature = 6SFagZKjko3Lagm-js0ugxUuI823OBQA40nsTT1jsxg

 

https://jwt.io/

위 사이트에서 token 테스트 가능하다 

 

 

구현

access는 유효기간(30분~2시간)이 짧고

refresh는 유효기간(2주~1달)이 길다.

 

가입할때 access와 refresh를 발급하여 클라에게 전송 refresh는 db에 저장한다 

 

클라에서 api요청시 access를 header에 넣어서 확인 

 

서버에 만료된 access가 왔을때

토큰안의 id를 가진 유저정보 확인 ->문제있으면 오류

refresh token의 존재여부 확인 -> 문제있으면 오류(직접 임의로 지웠을시 재로그인 유도)

내가가진 refresh token과 같은지확인 ->문제있으면 오류

문제없을시 access 재발급 

 

access만료시 refresh token도 만료시 -> 오류 

 

로그아웃시 db에서 refresh를 지워서 access재발급을 못하도록 한다 

 

보안을 위해 2주마다 재로그인을 해야한다 

 

jwt방식 시간에 맞춰 강제로그아웃하기엔 적합하지않다 (추가작업필요)

강제로그아웃하는일이 생기는 서비스라면 session을 이용한 보안방식을 선택하라 

 

 

참고:

https://cotak.tistory.com/102

https://velog.io/@solchan/%EB%B0%B1%EC%97%85-Refresh-Token-%EB%B0%9C%EA%B8%89%EA%B3%BC-Access-Token-%EC%9E%AC%EB%B0%9C%EA%B8%89

 

반응형

'python > fastapi' 카테고리의 다른 글

nginx ELB-HealthChecker/2.0 log 없애기  (0) 2023.03.17
sqlmodel create_all table생성 안될때  (0) 2022.08.31
[Errno 48] Address already in use  (0) 2022.08.29

sqlmodel 사용시 

SQLModel.metadata.create_all(engine) 호출시 db에 테이블생성이 되야하는데 안될때 

SQLModel.metadata.create_all 코드가 있는 곳에 내가 생성하고자 하는 models class들을 import 해야한다!! ★

ex)

from models 부분이 중요하다 

from sqlmodel import SQLModel, create_engine, Session
from models import Team, Hero, HeroTeamLink

mariadb = "mysql+pymysql"
postgresql = "postgresql+psycopg2"

engine = create_engine('{db}://{username}:{password}@{host}:{port}/{db_name}'.format(
    db=postgresql,
    username='id',
    password='pw',
    host='localhost',
    port='1233',
    db_name='team'
), echo=False)  # echo= sql log

def create_db_and_tables():
    SQLModel.metadata.create_all(engine)

혹시 그래도 안된다면 

 

직접만든 model 안에 __tablename__도 입력하여 시도해보길 바란다 

 

이걸로 하루날림 

+

가끔 특정 타이블만 안만들어진다면 만들어진 클래스 똑같이 복사해서 이름바꾸면 된다. 이게무슨 ㅡㅡ

 

반응형

'python > fastapi' 카테고리의 다른 글

nginx ELB-HealthChecker/2.0 log 없애기  (0) 2023.03.17
jwt access refresh token에 대한 정의  (0) 2022.09.07
[Errno 48] Address already in use  (0) 2022.08.29

서버 실행시 이미 사용중이라고 뜬다면 

 

터미널에서 

sudo lsof -i:[원하는포트명]

 

ex)sudo lsof -i:8000

검색 후 

pid아이디 확인 후

 

kill [pid id]

ex) kill 26423

 

반응형

'python > fastapi' 카테고리의 다른 글

nginx ELB-HealthChecker/2.0 log 없애기  (0) 2023.03.17
jwt access refresh token에 대한 정의  (0) 2022.09.07
sqlmodel create_all table생성 안될때  (0) 2022.08.31

 

connection = pymysql.connect(host='host', port=3306,
                             db='db', user='user',
                             passwd='pw', charset='utf8')
cursor = connection.cursor()

connection.ping(reconnect=True) # try reconnect


sql = f"REPLACE INTO item (name,price) VALUES (%s,%s)"
cursor.execute(sql, ("name","100"))
connection.commit()

connection.ping(reconnect=True)를 추가한다

 

반응형

'python > python' 카테고리의 다른 글

anaconda 파이썬 64bit 32bit 설치  (0) 2018.12.01
options = webdriver.ChromeOptions()
options.add_argument('headless')
    
options.add_argument("--start-maximized") # add
options.add_argument("--window-size=1920,1080") # add
    
dv = webdriver.Chrome(path, options=options)

 

반응형

'python > crawling' 카테고리의 다른 글

selenium login 403 , access denied  (0) 2021.08.11
beautiful soup 크롤링 안될때  (0) 2021.08.11

selenium 로그인이 안될때 

option = webdriver.ChromeOptions()
option.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36')

 

그래도 안될때 

option.add_argument('--disable-blink-features=AutomationControlled')
option.add_argument("--disable-extensions")
option.add_experimental_option('useAutomationExtension', False)
option.add_experimental_option("excludeSwitches", ["enable-automation"])

 

아래꺼 넣으니까 된다 

 

 

전체

 

option = webdriver.ChromeOptions()
option.add_argument('--no-sandbox')
option.add_argument("disable-gpu")
option.add_argument("--lang=ko_KR")
option.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36')
option.add_argument('--disable-blink-features=AutomationControlled')
option.add_argument("--disable-extensions")
option.add_experimental_option('useAutomationExtension', False)
option.add_experimental_option("excludeSwitches", ["enable-automation"])
driver = webdriver.Chrome(path, options=option)
driver.get("https://naver.com")

 

 

 

참고 :https://stackoverflow.com/questions/66989755/getting-403-when-using-selenium-to-automate-checkout-process

반응형

'python > crawling' 카테고리의 다른 글

selenium 사용중 option headless 추가시 에러날때  (0) 2021.08.18
beautiful soup 크롤링 안될때  (0) 2021.08.11

+ Recent posts