2018年8月23日 星期四

[Python] Selenium操作Firefox


安裝selenium
pip install selenium==3.14.0

安裝geckodriver
# 取得合適的版本
wget https://github.com/mozilla/geckodriver/releases/download/v0.21.0/geckodriver-v0.21.0-linux64.tar.gz
# 解壓縮
tar zxvf geckodriver-v0.21.0-linux64.tar.gz
sudo mv geckodriver /usr/bin

設定firefox環境參數
export DISPLAY=:0.0

現在可以來測試selenium效果,打開瀏覽器到google,截圖後存檔。若執行成功應該會在同一目錄下產生google擷取畫面。
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('https://www.google.com')
browser.save_screenshot('screenshot_google.png')
browser.close()

2018年8月13日 星期一

[Vue.js] 在ubuntu安裝 Vue.js

方法一、下載原始碼
# install
weget http://vuejs.org/js/vue.min.js

方法二、npm安裝
npm install vue
npm install --global vue-cli

# create a new project
vue init webpack my-project
執行這個專案
npm install
npm run dev
打開網頁 http://localhost:8080可以看到預設vue的頁面

2018年8月6日 星期一

[django] 將Django專案部署到Heroku

首先安裝相關套件
sudo apt-get install snapd
# 安裝heroku cli(Linunx)
# https://devcenter.heroku.com/articles/heroku-cli#download-and-install
sudo snap install heroku --classic

# 安裝django-heroku
pip install django-heroku
# 安裝gunicorn
pip install gunicorn # 安裝git
sudo apt install git

若成功安裝就可以登入Heroku開始建立專案囉! 尚未有Heroku帳號的,請按註冊Heroku會員。
# 登入Heroku
heroku login

先建立一個空白的專案
mkdir heroku-python
cd heroku-python
# create project
django-admin startproject mysite .
打開mysite/settings.py,先將IP加到ALLOWED_HOSTS,'*'是允許所有的Hostname,比較偷懶的方式。再來加入heroku的套件,套用這個檔案內的設定。
# mysite/settings.py
import django_heroku

ALLOWED_HOSTS = ['*']
...

# end of file
django_heroku.settings(locals())
為了讓Heroku知道專案需要的環境,有兩個必要的檔案Procfile和requirements.txt必須手動加入,請注意Procfile沒有副檔名。
# Procfile
web: gunicorn mysite.wsgi

requirements.txt可以透過pip freeze自動生成,內容可以參考下面。
# requirements.txt
Django==2.1
django-heroku==0.3.1
gunicorn==19.9.0

接著,新增一個Heroku專案,一種由系統自動產生,一種直接在create後面加上你想要的名稱。 之後這個專案網址是[project_name].herokuapp.com,因此如果顯示"Name [project-name] is already taken",可能是你想要的名稱已經先被佔用了。
# 由Heroku自動產生專案名稱
heroku create
# 使用者指定專案名稱
heroku create [project_name]
執行heroku create自動產生的結果,可以參考下面,intense-river-54924就是Heroku隨機產生的專案名稱。
Creating app... done, ⬢ intense-river-54924
https://intense-river-54924.herokuapp.com/ | https://git.heroku.com/intense-river-54924.git
新增一個 git repository
git init
git add .
git commit -m "initial commit"

# 設定遠端伺服器/設定專案的上傳目標
heroku git:remote -a intense-river-54924
# 確認是否設定成功
git remote -v
執行git remote -v的顯示範例
heroku https://git.heroku.com/intense-river-54924.git (fetch)
heroku https://git.heroku.com/intense-river-54924.git (push)

因為staticfiles設定要調整,所以先取消執行collectstatic的部分,才不會有錯誤喔!
# 設定參數
# heroku config:set [key]=[value]
heroku config:set DISABLE_COLLECTSTATIC=1
設定完成後就上傳至遠端Heroku的伺服器
# git push [remote-name] [branch-name]
git push heroku master
執行網站,此時就可以打開瀏覽器查看網頁囉!
heroku ps:scale web=1

專案名稱是intense-river-54924,只要打開https://intense-river-54924.herokuapp.com/,就可以看到結果囉!如果不記得專案名稱,可以透過指令顯示執行網站url。
heroku open


部署到這邊告一段落,底下有些指令可以參考使用,像是有錯誤無法正常顯示網站,可以查看Log來排除錯誤。
heroku logs --tail
heroku logs --tail --app [HEROKU_APP_NAME]
其他Django的指令執行範例,不是本地端而是在遠端伺服器執行。
heroku run python mysite/manage.py migrate
heroku run python mysite/manage.py createsuperuser
在編輯你的專案時,小幅度的修改可以透過以下指令在本地端執行,確定沒有問題時再推到遠端去。
# Procfile is required.
# 效果如同 "python manage.py runserver 0.0.0.0:5000"
heroku local
當你想要執行已有的專案時,可以自遠端伺服器取得專案
heroku git:clone -a [project-name]

參考資料:
https://devcenter.heroku.com/articles/getting-started-with-python

2018年8月5日 星期日

連線VMware VM


在Windows環境下安裝VMware,如果要從windows連到VMware的linux虛擬主機,首先請確定VM->Settings,網路的設定為NAT。


接者請安裝以下套件。
# install
sudo apt-get install ssh
sudo apt-get install openssh-server

查詢指令ifconfig得到VM的IP,即可連線。

2018年7月24日 星期二

安裝node js v8.9.4

前置作業
# install
apt-get update
sudo apt-get install build-essential libssl-dev
curl https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | sh
source ~/.profile
安裝
# install
nvm install v8.9.4
確認安裝版本
# check
node -v

2018年3月21日 星期三

[django] django-widget-tweaks 設定Form widget套件

請擇一方式完成django-widget-tweaks安裝
[方法一] pip
# 利用pip安裝
pip install django-widget-tweaks

[方法二] 原始碼安裝
# 選定安裝的版本,將原始碼下載到當前目錄
wget --no-check-certificate https://github.com/jazzband/django-widget-tweaks/archive/1.4.2.tar.gz
# 解壓縮
tar zvxf 1.4.2.tar.gz
cd django-widget-tweaks-1.4.2/
python setup.py install

完成安裝後,使用套件要在settings.py裡面include
# project/settings.py
INSTALLED_APPS = (
    ...
    'widget_tweaks',
)

在Template裡面可以這樣設定,這邊套用了bootstrap的form style。
# templates/index.html
{% load widget_tweaks %}

<form method="post">
  {% csrf_token %}
  {% for field in form %}<br />
    <div class="form-group">
      <label for="{{ field.id_for_label }}">{{ field.label }} :</label>
      {% render_field field placeholder=field.help_text class+="form-control" %}
    </div>
  {% endfor %}
  <button class="btn btn-primary" type="sumbit">儲存</button>
</form>

其他的運用方式,可以參考 這裡,了解更多!

參考資料:
https://github.com/jazzband/django-widget-tweaks

2018年3月13日 星期二

[HTML] 上傳媒體(圖片、影片、聲音)

透過accept這個attr來設定上傳檔案的類型,以及資料來源,可用手機測試實作效果。
<input accept="video/*;capture=camcorder" />
<input accept="audio/*;capture=microphone" />
<input accept="image/*" /> 限制檔案為影像
<input accept="image/*;capture=camera" /> 限制檔案為影像,資料來源為相機
<input accept="image/*" multiple="" type="file" />


[Python] Virtualenv基本操作

使用pip安裝virtualenv
# install virtualenv
sudo pip install virtualenv
開發Djagno專案,常搭配virtualenv使用,能透過virtualenv創造虛擬環境,在啟動虛擬環境的情況下,pip所安裝的套件只存在虛擬環境中,使得專案可以互相獨立,因此不同的專案可以安裝不同版本的使用套件。

建立新的虛擬環境
# move to your project
cd [myproject]
# add virtualenv
virtualenv [projectenv]

啟動虛擬環境
# active your virtualenv
source [projectenv]/bin/activate
在command line前面出現 (projectenv),代表啟動成功,即可安裝所需的套件。

關閉虛擬環境
# close your virtualenv
deactivate

2018年2月23日 星期五

[Django] 重設admin密碼

如果忘記django user的密碼的重設方式 先開啟 python shell
python manage.py shell
指定要修改的帳號,set_password中填入新密碼
# import User first
from django.contrib.auth.models import User

# reset password
user = User.objects.get(username='root') user.set_password('newpassword')
user.save()
如果忘記帳號的查詢方式
# list superuser
User.objects.filter(is_superuser=True)

# list all user
User.objects.all()
找到帳號後再用剛剛的方式重設密碼即可

2018年1月28日 星期日

[Django] REST framework

首先必須安裝rest framework
# install django rest framework
pip install djangorestframework
在settings.py加上rest_framework
# project/settings.py
INSTALLED_APPS = (
    ...
    'app',
    'rest_framework',
)
準備資料表
# app/models.py
from django.db import models
def Participant():
    name = models.CharField(max_length=20)
    age = models.DecimalField(max_digits=3,decimal_places=0)
    GENDER = (
        ('F', 'Female'),
        ('M', 'Male'),
    )
    gender = models.CharField(max_length=1, choices=GENDER)

初始資料表或更新時,執行makemigrations產生model.py的資料庫語言,執行migrate則會根據這份文件去建立/修改資料表。shell指令則是進入Python的互動模式去操作資料庫。
# active model
python manage.py makemigrations
python manage.py migrate

# execute python shell
python manage.py shell
# (Python Shell)add a new record in Participant
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from app.models import Participant
>>> record = Participant(name='Mike', age='20', gender='M')
>>> record.save()
serializers.py
# app/serializers.py
from rest_framework import serializers
from app.models import Participant

class ParticipantSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Participant
        fields = ('url', 'name', 'age', 'gender')
views.py
# app/views.py
from rest_framework import viewsets
from app.models import Participant
from app.serializers import ParticipantSerializer

class ParticipantViewSet(viewsets.ModelViewSet):
    queryset = Participant.objects.all()
    serializer_class = ParticipantSerializer
url.py
# project/url.py
from django.conf.urls import url, include
from rest_framework import routers
from app.views import ParticipantViewSet

router = routers.DefaultRouter()
router.register(r'participants', ParticipantViewSet)

# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
    ...
    url(r'^api/', include(router.urls)),
    url(r'^api/api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

接著就可以在瀏覽器上確認API有沒有正常運作。

URL- http://www.example.com.tw/api/

URL- http://www.example.com.tw/api/participants/


URL- http://www.example.com.tw/api/participants/1/

我們能夠透過設定權限,防止資料被任意串改,在登入的情況下才能新增/修改/刪除,其他僅能取得資料。
# app/views.py
class ParticipantViewSet(viewsets.ModelViewSet):
    queryset = Participant.objects.all()
    serializer_class = ParticipantSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly)
或是
# app/views.py
class ParticipantViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Participant.objects.all()
    serializer_class = ParticipantSerializer

URL- http://www.example.com.tw/api/api-auth/login/
右上角點選「Log in」,輸入帳密後才有修改的權限。




參考資料:
http://www.django-rest-framework.org/tutorial/quickstart/