±à¼ÍƼö: |
±¾ÎÄÀ´×Ôtencent£¬ÎÄÕÂÖ÷Òª½éÉÜÈçºÎʹÓúó¶ËDjango
+ ǰ¶ËVue.jsµÄ¼¼ÊõÕ»¿ìËٵشÆðÒ»Ì×webÏîÄ¿µÄ¿ò¼Ü¡£ |
|
Ò»¡¢ ±³¾°
ÔÚ¹¤×÷ÖÐÎÒÃǾ³£ÐëÒª¹¹¼þһЩ»ùÓÚwebµÄÏîÄ¿£¬ÀýÈçÄÚ²¿²âÊÔÆ½Ì¨¡¢ÔËάϵͳµÈ¡£±¾ÆªÖ÷Òª½éÉÜÈçºÎʹÓúó¶ËDjango
+ ǰ¶ËVue.jsµÄ¼¼ÊõÕ»¿ìËٵشÆðÒ»Ì×webÏîÄ¿µÄ¿ò¼Ü¡£
ΪʲôʹÓÃDjangoºÍVue.js?
DjangoÊÇPythonÌåϵÏÂ×î³ÉÊìµÄweb¿ò¼ÜÖ®Ò»£¬ÓÉÓÚPythonÓïÑÔµÄÒ×ÓÃÐÔºÍÊÜÖÚÃæ¹ã£¬Django¿ò¼ÜÒ²ÒòÆäÄܹ»¿ìËÙ¿ª·¢ÍøÕ¾Ó¦ÓõÄÌØÐÔ³ÉΪÁËÖÐСÐÍÍøÕ¾¿ª·¢¿ò¼ÜÊ×Ñ¡¡£ÇÒDjango¾ß±¸µÄÊý¾Ý·ÖÎö(
Pandas )¡¢ÈÎÎñ¶ÓÁÐ( Celery )¡¢Restful API( Django REST framework
)¡¢ORM(ÀàËÆjavaµÄhibernate)µÈÒ»ÖÚ¹¦Äܶ¼Ê¹µÃÓû§ÔÚÃæ¶ÔÈκν¨Õ¾ÐèÇóʱ¶¼Äܹ»µÃÐÄÓ¦ÊÖ¡£
Vue.jsÊǵ±ÏºܻðµÄÒ»¸öJavaScript MVVM¿â£¬ËüÊÇÒÔÊý¾ÝÇý¶¯ºÍ×é¼þ»¯µÄ˼Ïë¹¹½¨µÄ¡£Ïà±ÈÓÚAngular.js£¬Vue.jsͬÑùÖ§³ÖË«Ïò°ó¶¨¡¢mustache±êÇ©Óï·¨µÈÌØÐÔ£¬²¢ÌṩÁ˸ü¼Ó¼ò½à¡¢¸üÒ×ÓÚÀí½âµÄAPI£¬Ê¹µÃÎÒÃÇÄܹ»¿ìËÙµØÉÏÊÖ²¢Ê¹ÓÃVue.js¡£
±¾ÆªÊ¹ÓÃVue.js×÷Ϊǰ¶Ë¿ò¼Ü£¬´úÌæDjango±¾Éí½ÏΪåîÈõµÄÄ£°åÒýÇæ£¬DjangoÔò×÷Ϊ·þÎñ¶ËÌṩapi½Ó¿Ú£¬Ê¹µÃǰºó¶ËʵÏÖÍêÈ«·ÖÀ룬¸üÊʺϵ¥Ò³Ó¦ÓõĿª·¢¹¹½¨¡£
¶þ¡¢ »·¾³×¼±¸
°²×°»·¾³£º
Djangoϵ£º
Python 2.7 +
Django 1.11
Mysql 5.7
PythonµÄMySQLdbÄ£¿éµÈ
ÍÆ¼öpythonÏà¹ØµÄÄ£¿é£¨°üÀ¨Django£©¶¼Ê¹ÓÃpython×Ô´øµÄpip°²×°Æ÷°²×°¡£ÃüÁpip
install django¼´¿É°²×°×îа汾µÄdjango
Vue.jsϵ£º
Node.js 6.1
ÓйØVueµÄÄ£¿é(°üÀ¨vue)ÎÒÃǶ¼Ê¹ÓÃnode×Ô´øµÄnpm°ü¹ÜÀíÆ÷°²×°
Èý¡¢ ¹¹½¨DjangoÏîÄ¿
ÎÒÃÇÊ×ÏÈʹÓÃDjangoÀ´´î½¨webºó¶Ëapi¿ò¼Ü¡£
1¡¢ ÏÈÔÚÖÕ¶ËÇÃÈëÃüÁ
django-admin
startproject myproject |
Ŀ¼½á¹¹£º

2¡¢ ½øÈëÏîÄ¿¸ùĿ¼£¬´´½¨Ò»¸öapp£º
python manage.py
startapp myapp |
Ŀ¼½á¹¹£º

3¡¢ ÔÚmyprojectϵÄsettings.pyÅäÖÃÎļþÖУ¬°ÑĬÈϵÄsqllite3Êý¾Ý¿â»»³ÉÎÒÃǵÄmysqlÊý¾Ý¿â£º
# Database
# https://docs.djangoproject.com/en/1.11/ref /settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'myproject',
'USER': 'root',
'PASSWORD': 'root',
'HOST': '127.0.0.1',
}
} |
²¢°Ñapp¼ÓÈëµ½installed_appsÁбíÀ
INSTALLED_APPS
= [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
] |
4¡¢ ÔÚappĿ¼ÏµÄmodels.pyÀïÎÒÃǼòµ¥Ð´Ò»¸ömodelÈçÏ£º
# -*- coding:
utf-8 -*-
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class Book(models.Model):
book_name = models.CharField(max_length=64)
add_time = models.DateTimeField(auto_now_add=True)
def __unicode__(self):
return self.book_name |
Ö»ÓÐÁ½¸ö×ֶΣ¬ÊéÃûbook_nameºÍÌí¼Óʱ¼äadd_time¡£Èç¹ûûÓÐÖ¸¶¨Ö÷¼üµÄ»°django»á×Ô¶¯ÐÂÔöÒ»¸ö×ÔÔöid×÷ΪÖ÷¼ü
5¡¢ ÔÚappĿ¼ÏµÄviewsÀïÎÒÃÇÐÂÔöÁ½¸ö½Ó¿Ú£¬Ò»¸öÊÇshow_books·µ»ØËùÓеÄÊé¼®ÁÐ±í£¨Í¨¹ýJsonResponse·µ»ØÄܱ»Ç°¶Ëʶ±ðµÄjson¸ñʽÊý¾Ý£©£¬¶þÊÇadd_book½ÓÊÜÒ»¸ögetÇëÇó£¬ÍùÊý¾Ý¿âÀïÌí¼ÓÒ»ÌõbookÊý¾Ý£º
# Create your
views here.
@require_http_methods(["GET"])
def add_book(request):
response = {}
try:
book = Book(book_name=request.GET.get('book_name'))
book.save()
response['msg'] = 'success'
response['error_num'] = 0
except Exception,e:
response['msg'] = str(e)
response['error_num'] = 1
return JsonResponse(response)
@require_http_methods(["GET"])
def show_books(request):
response = {}
try:
books = Book.objects.filter()
response['list'] = json.loads(serializers.serialize("json",
books))
response['msg'] = 'success'
response['error_num'] = 0
except Exception,e:
response['msg'] = str(e)
response['error_num'] = 1
return JsonResponse(response) |
¿ÉÒÔ¿´³ö£¬ÔÚORMµÄ°ïæÏ£¬ÎÒÃǵĽӿÚʵ¼ÊÉϲ»ÐèÒª×Ô¼ºÈ¥×éÖ¯SQL´úÂë
6¡¢ ÔÚappĿ¼Ï£¬ÐÂÔöÒ»¸öurls.pyÎļþ£¬°ÑÎÒÃÇÐÂÔöµÄÁ½¸ö½Ó¿ÚÌí¼Óµ½Â·ÓÉÀ
from django.conf.urls
import url, include
import views
urlpatterns = [
url(r'add_book$', views.add_book, ),
url(r'show_books$', views.show_books, ),
] |
ÎÒÃÇ»¹Òª°ÑappϵÄurlsÌí¼Óµ½projectϵÄurlsÖУ¬²ÅÄÜÍê³É·ÓÉ£º
from django.conf.urls
import url, include
from django.contrib import admin
from django.views.generic import TemplateView
import myapp.urls
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^api/', include(myapp.urls)),
url(r'^$', TemplateView.as_view(template_name="index.html")),
] |
ÔÚÏîÄ¿µÄ¸ùĿ¼£¬ÊäÈëÃüÁ
python manage.py
makemigrations myapp
python manage.py migrate |
²éѯÊý¾Ý¿â£¬¿´µ½book±íÒѾ×Ô¶¯´´½¨ÁË£º

ÔÚÏîÄ¿µÄ¸ùĿ¼£¬ÊäÈëÃüÁ
python manage.py
runserver |
Æô¶¯·þÎñ£¬Í¨¹ýpostman²âÊÔÒ»ÏÂÎÒÃǸղÅдµÄÁ½¸ö½Ó¿Ú£º
add_book

show_books

ËÄ¡¢ ¹¹½¨Vue.jsǰ¶ËÏîÄ¿
1¡¢ ÏÈÓÃnpm°²×°vue-cli½ÅÊּܹ¤¾ß£¨vue-cliÊǹٷ½½ÅÊּܹ¤¾ß£¬ÄÜѸËÙ°ïÄã´î½¨ÆðvueÏîÄ¿µÄ¿ò¼Ü£©£º
°²×°ºÃºó£¬ÔÚprojectÏîÄ¿¸ùĿ¼Ï£¬Ð½¨Ò»¸öǰ¶Ë¹¤³ÌĿ¼£º
vue-init webpack
appfront //°²×°ÖаÑvue-routerÑ¡ÉÏ£¬ÎÒÃÇÐëÒªËüÀ´×öǰ¶Ë·ÓÉ |
½øÈëappfrontĿ¼£¬ÔËÐÐÃüÁ
npm install
//°²×°vueËùÐëÒªµÄnodeÒÀÀµ |
ÏÖÔÚÎÒÃÇ¿ÉÒÔ¿´µ½Õû¸öÎļþĿ¼½á¹¹ÊÇÕâÑùµÄ£º

2¡¢ ÔÚĿ¼srcϰüº¬Èë¿ÚÎļþmain.js£¬Èë¿Ú×é¼þApp.vueµÈ¡£ºó׺ΪvueµÄÎļþÊÇVue.js¿ò¼Ü¶¨ÒåµÄµ¥Îļþ×é¼þ£¬ÆäÖбêÇ©ÖеÄÄÚÈÝ¿ÉÒÔÀí½âΪÊÇÀàhtmlµÄÒ³Ãæ½á¹¹ÄÚÈÝ£¬±êÇ©ÖеÄÊÇjsµÄ·½·¨¡¢Êý¾Ý·½ÃæµÄÄÚÈÝ£¬¶øÔòÊÇcssÑùʽ·½ÃæµÄÄÚÈÝ£º

3¡¢ ÎÒÃÇÔÚsrc/componentÎļþ¼ÐÏÂн¨Ò»¸öÃûΪLibrary.vueµÄ×é¼þ£¬Í¨¹ýµ÷ÓÃ֮ǰÔÚDjangoÉÏдºÃµÄapi£¬ÊµÏÖÌí¼ÓÊé¼®ºÍչʾÊé¼®ÐÅÏ¢µÄ¹¦ÄÜ¡£ÔÚÑùʽ×é¼þÉÏÎÒÃÇʹÓÃÁ˶öÁËôÍŶÓÍÆ³öµÄelement-ui£¬ÕâÊÇÒ»Ì×רÃÅÆ¥ÅäVue.js¿ò¼ÜµÄ¹¦ÄÜÑùʽ×é¼þ¡£ÓÉÓÚ×é¼þµÄ
±àÂëÉæ¼°µ½Á˺ܶàjs¡¢html¡¢cssµÄ֪ʶ£¬²¢²»ÊDZ¾ÎĵÄÖØµã£¬Òò´ËÔÚ´ËÖ»Ìù³ö²¿·Ö´úÂ룺

4¡¢ ÔÚsrc/routerĿ¼µÄindex.jsÖУ¬ÎÒÃǰÑн¨µÄHome×é¼þ£¬ÅäÖõ½vue-router·ÓÉÖУº

5¡¢ Èç¹û·¢ÏÖÁбíץȡ²»µ½Êý¾Ý£¬¿ÉÄÜÊdzöÏÖÁË¿çÓòÎÊÌ⣬´ò¿ªä¯ÀÀÆ÷consoleÈ·ÈÏ£º

ÕâʱºòÎÒÃÇÐëÒªÔÚDjango²ã×¢Èëheader£¬ÓÃDjangoµÄµÚÈý·½°üdjango-cors-headersÀ´½â¾ö¿çÓòÎÊÌ⣺
pip install
django-cors-headers |
settings.py Ð޸ģº
MIDDLEWARE =
[
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware. SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware. AuthenticationMiddleware',
'django.contrib.messages.middleware. MessageMiddleware',
'django.middleware.clickjacking. XFrameOptionsMiddleware',
]
CORS_ORIGIN_ALLOW_ALL = True |
×¢ÒâÖмä¼þµÄÌí¼Ó˳Ðò
6¡¢ ÔÚǰ¶Ë¹¤³ÌĿ¼Ï£¬ÊäÈënpm run devÆô¶¯node×Ô´øµÄ·þÎñÆ÷£¬ä¯ÀÀÆ÷»á×Ô¶¯´ò¿ª£¬ ÎÒÃÇÄÜ¿´µ½Ò³Ã棺

³¢ÊÔÐÂÔöÊé¼®£¬ÐÂÔöµÄÊé¼®ÐÅÏ¢»áʵʱ·´Ó³µ½Ò³ÃæµÄÁбíÖУ¬ÕâµÃÒæÓÚVue.jsµÄÊý¾ÝË«Ïò°ó¶¨ÌØÐÔ¡£
ÔÚǰ¶Ë¹¤³ÌĿ¼Ï£¬ÊäÈënpm run build£¬Èç¹ûÏîĿûÓдíÎóµÄ»°£¬¾ÍÄܹ»¿´µ½ËùÓеÄ×é¼þ¡¢css¡¢Í¼Æ¬µÈ¶¼±»webpack×Ô¶¯´ò°üµ½distĿ¼ÏÂÁË£º

Îå¡¢ ÕûºÏDjangoºÍVue.js
ĿǰÎÒÃÇÒѾ·Ö±ðÍê³ÉÁËDjangoºó¶ËºÍVue.jsǰ¶Ë¹¤³ÌµÄ´´½¨ºÍ±àд£¬µ«Êµ¼ÊÉÏËüÃÇÊÇÔËÐÐÔÚ¸÷×ԵķþÎñÆ÷ÉÏ£¬ºÍÎÒÃǵÄÒªÇóÊDz»Ò»Öµġ£Òò´ËÎÒÃÇÐëÒª°ÑDjangoµÄTemplateViewÖ¸ÏòÎÒÃǸղÅÉú³ÉµÄǰ¶ËdistÎļþ¼´¿É¡£
1¡¢ ÕÒµ½projectĿ¼µÄurls.py£¬Ê¹ÓÃͨÓÃÊÓͼ´´½¨×î¼òµ¥µÄÄ£°å¿ØÖÆÆ÷£¬·ÃÎÊ
¡º/¡»Ê±Ö±½Ó·µ»Ø index.html:
urlpatterns
= [
url(r'^admin/', admin.site.urls),
url(r'^api/', include(myapp.urls)),
url(r'^$', TemplateView.as_view(template_name="index.html")),
] |
2¡¢ ÉÏÒ»²½Ê¹ÓÃÁËDjangoµÄÄ£°åϵͳ£¬ËùÒÔÐèÒªÅäÖÃÒ»ÏÂÄ£°åʹDjangoÖªµÀ´ÓÄÄÀïÕÒµ½index.html¡£ÔÚprojectĿ¼µÄsettings.pyÏ£º
TEMPLATES =
[
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': ['appfront/dist'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors. messages',
],
},
},
] |
3¡¢ ÎÒÃÇ»¹ÐèÒªÅäÖÃһϾ²Ì¬ÎļþµÄËÑË÷·¾¶¡£Í¬ÑùÊÇprojectĿ¼µÄsettings.pyÏ£º
# Add for vuejs
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "appfront/dist/static"),
] |
4¡¢ ÅäÖÃÍê³É£¬ÎÒÃÇÔÚprojectĿ¼ÏÂÊäÈëÃüÁîpython manage.py runserver£¬¾ÍÄܹ»¿´µ½ÎÒÃǵÄǰ¶ËÒ³ÃæÔÚä¯ÀÀÆ÷ÉÏÕ¹ÏÖ£º

×¢Òâ·þÎñµÄ¶Ë¿ÚÒѾÊÇDjango·þÎñµÄ8000¶ø²»ÊÇnode·þÎñµÄ8080ÁË
Áù¡¢ ²¿Êð
ÓÉÓÚpythonµÄ¿çÆ½Ì¨ÌØÐÔ£¬Òò´ËÀíÂÛÉÏÖ»ÒªÔÚ·þÎñÆ÷Éϰ²×°ºÃËùÓеÄÒÀÀµ£¬Ö±½Ó°ÑÏîĿĿ¼¿½±´µ½·þÎñÆ÷Éϼ´¿ÉÔËÐС£ÕâÀïÖ»ÌáÒ»µã£ºÈç¹ûΪÏîÄ¿ÅäÖÃÁËnginx×÷Ϊ·´Ïò´úÀí£¬ÄÇôҪÔÚnginxÖÐÅäÖÃËùÓеľ²Ì¬Îļþpath¶¼Ö¸ÏòDjangoÏîÄ¿ÖÐÅäÖõľ²Ì¬Îļþurl£¬ÔÚsettings.pyÖпÉÅäÖÃurl·¾¶£º
# Static files
(CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
STATIC_URL = '/static/' |
Æß¡¢ ÆäËû
ʵÀýÏîÄ¿µÄÔÂë¶¼¿ÉÒÔÔÚ¸Ãgit·¾¶ÏÂÔØ£º
https://github.com/rogerlh/django_with_vue.git
|