장고 앱을 개발하다가 하나의 앱에 View 수가 많아져서 C 계열 언어처럼 전처리기로
#pragma region ~ endregion
으로 뷰를 한방에 묶어서 접어두고 싶었다.

그래서 시작한 폭풍 구글링.
근데 파이썬은 부모만 C계열 언어지, 전처리기는 사용할 수 없다는 안타까운 소식을 접했고...

꿩 대신 닭이다, 이가 없으면 잇몸으로라도 하자는 마음에 VSCode 확장프로그램 탭을 열고, region이라고 검색해봤다.

https://marketplace.visualstudio.com/items?itemName=maptz.regionfolder

 

#region folding for VS Code - Visual Studio Marketplace

OverviewQ & ARating & Review Visual Studio Code Custom Folding Extension This extension enhances the default code folding abilities of Visual Studio Code editor. Regions of code that you'd like to be folded can be wrapped with #region comments. The precise

marketplace.visualstudio.com

얄루! 마침 파이썬의 주석과 같은 #을 사용한다.

다른 언어에서는 주석처리를 한 후 #region을 써주어야 한다.

 

접기 전 (좌) , 접은 후 (우)

요렇게 지저분했던 녀석들이 우측처럼 다 접혀 들어갔다.

 

끝!

Github repository: https://github.com/maptz/Maptz.VSCode.Extensions.customfolding

로그인/회원등록 구현 과정 중 여태 영어만 집어넣다가 superuser 생성 시 이름으로 '최고 관리자'를 넣어줬다.

def create_superuser(self, admin_id, password): # 최고관리자 생성
        user = self.create_user(
            admin_id=admin_id,
            admin_level=True,
            admin_parent=0,
            admin_name='최고 관리자',
            
        )

 

그리고 manage.py createsuperuser를 실행했는데, 다음과 같은 오류가 발생했다.

django.db.utils.OperationalError: (1366, "Incorrect string value:
'\\xEC\\xB5\\x9C\\xEA\\xB3\\xA0...' for column 'admin_name' at row 1")

 

아..인코딩..

MYSQL 클라이언트로 접속 후 

 

mysql > show variables like 'c%';

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
| check_proxy_users        | OFF                        |
| collation_connection     | utf8_general_ci            |
| collation_database       | latin1_swedish_ci          |
| collation_server         | latin1_swedish_ci          |
| completion_type          | NO_CHAIN                   |
| concurrent_insert        | AUTO                       |
| connect_timeout          | 10                         |
| core_file                | OFF                        |
+--------------------------+----------------------------+

전부 utf8인데 이 database의 charset만 latin으로 되어있었다.

mysql > ALTER SCHEMA `App`  DEFAULT CHARACTER SET utf8;

이 스키마의 캐릭터셋을 utf8로 바꿔준다.

그리고 다시 manage.py createsuperuser를 실행해봤지만..

너 대체 나한테 왜그러니?

또 안된다...

혹시나 하고 models.py로 가서,

def create_superuser(self, admin_id, password): # 최고관리자 생성
        user = self.create_user(
            admin_id=admin_id,
            admin_level=True,
            admin_parent=0,
            admin_name='최고 관리자'.encode('utf8'),
        )

string.encode 속성을 강제로 넣어줬다.

makemigration, migrate 하고 createsuperuser 재시도

 

좋아 완벽했어.

Ajax 통신으로 공유하기 버튼을 클릭한 횟수와 공유한 게시글을 통해 유입된 인구수를 조사하기 위해 각각의 php파일을 만들고 서버와 통신을 시도했는데, 아래와 같은 오류를 내보냈다.

Access to XMLHttpRequest at 'https://url/ajax.php' from origin 'https://this\_url/' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

로컬에서 테스트했을 때는 같은 url상의 경로이기 때문에 당연하게 되었던 것이,

실제 경로에 스크립트 삽입 후 url이 바뀌었기 때문에 CORS정책에 의해 막힌다는 것.

사실상 유명무실한 정책인 것 같지만.. 그래도 어쩌겠는가..

방법은 클라이언트 사이드에서 확장도구를 사용하는 방법과, 서버 사이드에서 접근을 허용해주는 방법이 있다.

서버와 웹페이지가 같은 서버경로상에 있다면 굳이 필요 없겠지만 내 경우 여러곳에 배포할 목적으로 사용하는 것이기 때문에 서버 사이드에서 해결해 주도록 한다.

방법은 상당히 심플한데, 헤더에

Access-Control-Allow-Origin: \*
Access-Control-Max-Age: 86400
Access-Control-Allow-Headers: x-requested-with

요것들만 추가해주면 된다는 것..
하지만 저렇게만 하면 GET/POST 메소드 이외에는 사용이 안되기 때문에 다른 메서드를 사용하기 위해 하나 더 추가해준다.

Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS

최종적으로 PHP 코드는 이렇게 된다

1
2
3
4
header('Access-Control-Allow-Origin: *');
header('Access-Control-Max-Age: 86400');
header('Access-Control-Allow-Headers: x-requested-with');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');

아래에 잘 설명되어있는 글이 있으니 더 알아보고싶다면 참고하도록 하자.

https://brunch.co.kr/@adrenalinee31/1

'Web > PHP' 카테고리의 다른 글

[PHP] Ajax 크로스도메인(CORS) 이슈 해결  (0) 2019.10.11

+ Recent posts