Django 命令
Django 安装成功,系统便拥有了 django-admin.py 命令。执行 django-admin.py startproject bitcms 会自动生成项目 bitcms。
项目初始目录结构如下:
bitcms

└── bitcms
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
├── manage.py
其中,需要特别注意 manage.py 文件,它是 Django 项目管理的命令行工具。进入项目根目录,通过 manage.py 可以进行启动服务、新建应用、同步数据、创建用户等。
前端同学可能用到 Django 命令:
命令 参数说明
django-admin.py --version 查看 Django 版本。例如:我的 Django 版本为 1.8.12
python manage.py syncdb 同步数据,文档称自 1.7 版起已弃用
python manage.py migrate 启动项目时,可能会看到红色提醒You have unapplied migrations; your app may not work properly until they are applied.按照提示,执行 python manage.py migrate 即可。这时,会在项目根目录生成 db.sqlite3 数据文件,保存 Django 自带一些应用数据
python manage.py runserver 启动 Django 服务。默认在 127.0.0.1:8000 启动,如果提示 Error: That port is already in use. 说明端口被占用。可以选择在其他端口(如 8080)启动:python manage.py runserver 8080
python manage.py startapp blog 新建一个应用(如:blog)。执行成功,会在项目根目录生成 blog 应用目录。blog 目录下的文件在下一小节介绍
python manage.py collectstatic 把 app 下 static 中的静态文件全部拷贝到 STATIC_ROOT 路径指定的文件夹下。变量STATIC_ROOT在settings.py中设置
Tips:
使用 python manage.py 系列命令时,通常会将具体参数写入项目配置目录下的单独配置文件,如 bitcms/settings_dev.py。

然后,通过连接 --settings=bitcms.settings_dev 执行。以我们 bitcms.com 开发环境为例:
同步数据:python manage.py syncdb --settings=bitcms.settings_dev
启动服务:python manage.py runserver --settings=bitcms.settings_dev

Django 项目结构
bitcms

└── bitcms
├── __init__.py
├── settings.py
├── settings.dev.py
├── urls.py
├── wsgi.py
└── blog
└── migrations
├── __init__.py
└── templates
└── blog
├── index.html
├── __init__.py
├── admin.py
├── models.py
├── tests.py
├── urls.py
├── views.py
└── templates

├── 404.html
├── 500.html
└── static

└── css
└── js
└── img
├── db.sqlite3

├── manage.py
├── requirements.txt
├── README.md
各目录文件的具体说明:
bitcms(项目容器,执行 django-admin.py startproject bitcms 自动生成)

└── bitcms(项目管理目录,与项目容器同时生成且同名。新手易误认为一个应用,为什么不叫 config !-_-)
├── __init__.py(默认空文件,声明所在目录 bitcms 为 Python 模块)
├── settings.py(项目配置文件,可以配置:路径、应用、模板、缓存、数据库、时区、语言等)
├── settings.dev.py(为开发环境添加单独的配置文件,方便本地调试)
├── urls.py(应用路由配置,在这里配置 URL 正则,将 URL 请求分发到 Views)
├── wsgi.py(Python Web Server Gateway Interface,服务器部署相关的配置)
└── blog(应用目录,执行 python manage.py startapp blog 自动生成)
└── migrations(数据迁移模块,在 Django 1.7 之前版本,新建应用不会生成该目录)
├── __init__.py(声明所在目录 migrations 为 Python 模块)
└── templates(放置 blog 应用的模板文件)
└── blog(额外加一级目录,否则 Django 傻傻分不清同名模板应该去哪个应用去渲染 !-_-)
├── index.html
├── __init__.py(声明所在目录 blog 为 Python 模块)
├── admin.py(将 blog 数据模型注册到 Django 后台数据管理)
├── models.py(定义 blog 的数据模型,构建 blog 应用相关数据表结构)
├── tests.py(blog 的自动化测试文件)
├── urls.py(blog 的路由配置文件,将 URL 请求分发到 views)
├── views.py(定义函数:处理业务逻辑,响应请求,返回 HTML 等)
└── templates(放置公共模板文件)

├── 404.html
├── 500.html
└── static(放置静态资源文件)

└── css
└── js
└── img
├── db.sqlite3(数据文件,执行 python manage.py migrate 自动生成)
├── manage.py(Django 项目的命令行管理工具)
├── requirements.txt(记录 python 依赖,相当于 package.json。新手看到 txt 很容易当做普通文本 !-_-)
├── README.md(可以记录项目简介、环境搭建、特别注意、版本介绍内容等)
Tips:
其中,前端开发人员需要注意的目录文件包括:
日常开发中,主要关心 templates 目录和static 目录下的文件即可
搭建环境时,需要执行 pip install -r requirements.txt 安装项目后端依赖
运行环境时,需要执行 python manage.py runserver --settings=bitcms.settings_dev
开发环境报 Bad Request(400) 错误时,在 bitcms/urls.py 设置 ALLOWED_HOSTS=['*'] 允许任意访问来源
新建应用时,需要在 bitcms/settings.py 等 settings 文件加入应用名;同时,在 bitcms/urls.py 添加 URL 匹配
添加 HTML 页面时,除了编写模板文件,还需要修改应用下的 urls.py、views.py 文件,以及项目配置目录 bitcms 下的 urls.py。后面小节会具体介绍

添加新页面
想要为blog 应用添加一个页面,并在 Django 服务中通过 URL 访问,需要完成以下步骤:
添加 blog 应用到 bitcms/settings.py:

INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog', # 加入 blog 应用
)
添加模板文件 blog/templates/blog/index.html:
<!DOCTYPE html>

<html>
<head>
<meta charset="utf-8">
<title>{{ title }}</title>
</head>
<body>
<h3>bitcms 博客</h3>
<div class="content">

    {% for blog in blogs %}
  • {{ blog.name }}
  • {% endfor %}

</div>
</body>
</html>
添加响应函数到 blog/views.py:

-- coding: utf-8 --
from django.shortcuts import render

Create your views here.
def index(request):
context = {}
context['title'] = '首页'
context['blogs'] = [
{

'id': '1',
'name': '博客一',
'content': '第一篇博客',
}, {

'id': '2',
'name': '博客二',
'content': '第二篇博客',
},
]
return render(request, 'blog/index.html', context)
添加应用内路由 blog/urls.py:

-- coding: utf-8 --
from django.conf.urls import include, url

import blog.views as blog_views
from . import views
urlpatterns = [

url(r'^index/', blog_views.index),

url(r'^index/', views.index), # 注意:r'^index/' 不要忘掉斜杠 /
]
添加项目配置路由 bitcms/urls.py:

-- coding: utf-8 --
"""bitcms URL Configuration
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [

url(r'^admin/', include(admin.site.urls)),
url(r'^blog/', include('blog.urls')), # 注意:'blog.urls' 要加单引号
]
Tips:
如果出现 SyntaxError: Non-ASCII character 错误,说明 python 文件中(包括注释)出现了汉字。
这时,需要在代码最开始位置加入 # -- coding: utf-8 --
如果服务正常启动,页面仍然报 ERR_EMPTY_RESPONSE 错误,则可能是因为开启了翻墙工具,请尝试退出翻墙工具后重试
bitcms/settings.py 中 DEBUG = True 时,如果找不到静态资源,尝试在 bitcms/urls.py 配置:
STATICFILES_DIRS = (

os.path.join(BASE_DIR, "static"),
)
另外,如果使用 Django 相对路径方式加载静态资源,如 ,还需要在模板文件头部添加 {% load static %}
bitcms/settings.py 中 DEBUG = False 时,如果找不到静态资源,尝试在 bitcms/urls.py 配置:
from django.views.static import serve as static_serve
if settings.DEBUG is False:

urlpatterns += [
url(r'^static/(?P<path>.*)$', static_serve, {'document_root': settings.STATIC_ROOT}),
]
如果向后端发送的是 Ajax 请求,则需要在 views.py 函数做相应处理:

-- coding: utf-8 --
from django.shortcuts import render
from django.http import JsonResponse
def hotNews(request):

newsDict = {
'1': {
'id': '1',
'name': '中国队 1 : 0 韩国',
'content': '中国队取胜,仍保留出线可能',
},
'2': {
'id': '2',
'name': '人民的名义热播',
'content': '人民的名义热播,达康书记狂圈粉',
},
}
if request.is_ajax():
return JsonResponse(newsDict)
return render(request, 'news/hotNews.html', newsDict)
前端发送 Ajax 请求事,为了防止 CSRF 攻击,最好做以下设置:
$.ajaxSetup({

// 使用了模板变量,不能写在 js 文件中,要直接写在模板文件中
data: {csrfmiddlewaretoken: '{{ csrf_token }}' },
});

DTL 模板标签
DTL(Django template language) 是 Django 默认的模板语言,DTL 常用模板标签示例:
{{ sum|default:'0.00' }}
{% load static %}
{% url 'articel' 12 %}
{% if value in [10, 100, 1000] %}
... display 1
{% elif value < 10 %}
... display 2
{% else %}
... display 3
{% endif %}
{% for item in list reversed %}

<li>
{{forloop.counter1}}
{% if not forloop.first %}|{% endif %}
{{ item.name }}
</li>
{% endfor %}
{% for key, value in json.items %}

{{ key }}: {{ value }}
{% endfor %}
{{ request.user }}
{% if request.user.is_authenticated %}

您好,{{ request.user.username }}!
{% else %}

请登陆
{% endif %}
{{ request.path }}?{{ request.GET.urlencode }}
{% csrf_token %}
{# 模板注释 #}
{{ list|join:", " }}
{% include "nav.html" %}
{% block css %}{% endblock %}
{% extends "base.html" %}

隔离项目运行环境
开发中经常会在一台机器上安装多个的项目,各项目使用的 python 版本或依赖(如 Django)版本不同时,后安装的就会覆盖之前安装,造成之前项目无法运行。
可以通过 virualenv、Anaconda 等工具,在同一机器搭建多个虚拟 python 运行环境,将各项目隔离来避免以上问题。

下面以 Anaconda 为例,列出搭建一个 python 的虚拟运行环境用到的命令:
查看 python 环境列表:
conda info --envs
创建一个 python3 虚拟环境:
conda create -n bitenv python=3
激活(进入) py3 虚拟环境:
source activate bitenv
查看 python 版本:
python --version
查看 bitenv 已安装的 packages:
conda list -n bitenv
在 bitenv 安装 packages:
conda install -n bitenv Django=1.8.2
注销(离开)当前环境,恢复之前环境状态:
source deactivate bitenv
移除 bitenv 虚拟环境:
conda remove -n bitenv --all

结语
本人主要从事前端方向开发,刚接触 Django 不久,以上理解难免有误。欢迎留言指出~
作者: 王益达
链接:http://www.imooc.com/article/18499

对于入手【youmei.io】域名的原因,我是根据以下规则来的,当然最初不是这么想的,只是想要的域名都已经被注册了。。。

30字口诀:
小宝淘乐趣,大多优美妙。一五点微友,好天通万家。金易贝米人,快闪超聚帮。
小(小红书、小站教育)
宝(余额宝、驾考宝典)
淘(淘世界、蜜淘、淘汽档口)
乐(分期乐、乐流、乐动力)
趣(趣分期、我趣旅行)
大(大姨吗、大众点评、大智慧)
多(房多多、多盟、多看阅读)
优(优信拍、优酷土豆)
美(美团、美拍、美丽说、美图秀秀)
妙(奇妙清单、妙计旅行)
一(一个、一刻、一条、一席)
五(58到家、51talk)
点(养车点点、点名时间)
微(微信、微博、微在、微会)
友(友盟、友秘)
好(平安好房、好屋中国、好奇心日报)
天(天猫、天天果园、天天用车)
通(百度股市通、人脉通)
万(WIFI万能钥匙、十万个冷笑话)
家(汽车之家、河狸家)
金(金斧子、金数据)
易(网易、易车)
贝(贝贝、贝米)
米(小米、米聊)
人(人人、人人车)
快(快手、快的)
闪(闪电购、闪银)
超(超级课程表、超好玩)
聚(聚划算、聚美)
帮(阿姨帮、作业帮)
取名字总结有:10大“门派”
植物学派:蘑菇街、荔枝FM、土豆、IT桔子
动物学派:猿题库、功夫熊、小猪短租、小马购车、土巴兔、考拉FM、蜻蜓FM、企鹅吃喝指南、搜狗、搜狐
数字学派:51信用卡、58同城,59store
叠字学派:陌陌、探探、抱抱、人人、脉脉
字母学派:YY,QQ,JJ棋牌、KK唱响
拟声学派:滴滴、么么搜、嘟嘟美甲
实物学派:豆瓣、穿衣助手、饭本、觅食、团车、爱屋吉屋、药给力
创意学派:拉勾网、3W咖啡、托福Easy姐、喜马拉雅、黄油相机、面包旅行、雪球、斗鱼
国学学派:凤凰网、知乎、金箍棒、榫卯
洋气学派:UCloud,OneAPM,Keep,Fork,MONO,EMIE、NICE、IN、Face++
其他:
衍生学派:找钢网、找塑料、找叉叉
同业学派:易果生鲜、一米鲜、每日优鲜、爱鲜蜂
游戏学派:三国叉叉、萌叉叉、全民叉叉
取名字的关键有:3点friendly需要注意:
1.大脑记忆friendly:简而言之,容易记住。
2.输入法friendly:按音一次就能打出来,不会有生僻字。
3.搜索引擎friendly:搜索结果不会和一些常用或者热门词汇竞争。
案例:今日头条、周末去哪儿、学霸君
很好奇其他国家的互联网公司起名有什么规律~

解决问题:
You are using pip version 9.0.1, however version 10.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

解决方法
直接运行命令:python -m pip install --upgrade pip 就可以了
如果你电脑上安装了两个版本的python,比如Mac上本来自带python2版本,但是你想安装在python3目录内,请把解决方法的运行命令的python改成python3

升级并安装 pip

sudo apt-get update
sudo apt-get install python-pip

安装虚拟环境

sudo pip install virtualenv virtualenvwrapper
加入到环境变量中
当前用户目录下的 Env为虚拟环境存放的目录

echo "export WORKON_HOME=~/Env" >> ~/.bashrc
echo "source /usr/local/bin/virtualenvwrapper.sh" >> ~/.bashrc

激活配置

source ~/.bashrc

创建虚拟环境

环境名为:firstsite

在用户当前目录下创建 Django工程
cd ~
django-admin.py startproject firstsite

django 的初始化

cd ~/firstsite
./manage.py migrate
./manage.py createsuperuser

Django静态文件配置

nano firstsite/settings.py
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
./manage.py collectstatic

安装 uWSGI

sudo apt-get install python-dev
sudo pip install uwsgi

测试是否能够正常访问 django 项目

http 指定进程端口8080
home指定虚拟环境目录
chdir指定 项目工程所在目录
uwsgi --http :8080 --home /home/pi/Env/firstsite --chdir /home/pi/firstsite -w firstsite.wsgi

创建 uwsgi 的配置文件

sudo mkdir -p /etc/uwsgi/sites
cd /etc/uwsgi/sites

uwsgi 的配置相关内容(重点)

[uwsgi]
project = firstsite
base = /home/pi

chdir = %(base)/%(project)
home = %(base)/Env/%(project)
module = %(project).wsgi:application

master = true
processes = 5

socket = %(base)/%(project)/%(project).sock
chmod-socket = 666
vacuum = true
启动守护进程
vim /etc/systemd/system/uwsgi.service

[Unit]
Description=uWSGI Emperor service
After=syslog.target

[Service]
ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/sites
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target
重载守护进程的配置信息
sudo systemctl daemon-reload
保证系统重启后uwsgi守护进程自动重启
sudo systemctl enable uwsgi
启动uwsgi进程
sudo systemctl start uwsgi
nginx 的安装
sudo apt-get install nginx
nginx的配置
sudo nano /etc/nginx/sites-available/firstsite
server {
listen 80;
server_name firstsite.com www.firstsite.com;

location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/pi/firstsite;
}

location / {
include uwsgi_params;
uwsgi_pass unix:/home/pi/firstsite/firstsite.sock;
}
}
nginx配置生效
sudo ln -s /etc/nginx/sites-available/firstsite /etc/nginx/sites-enabled
检查配置
sudo service nginx configtest
重启nginx
sudo service nginx restart
非 debug 模式
非 debug 模式需要重启uwsgi 服务

sudo systemctl restart uwsgi