这篇文章是作者根据《Python核心编程》中的Django相关内容,结合自己实际使用经验,记录自己初学时的步骤。
一、环境
- Windows 7
- Python 3.6
- Django 1.8.17
- Pycharm 2016.2.3/IDEA 2016.3.3 + python插件
二、安装环境
Python:https://www.python.org/
Pycharm:http://www.jetbrains.com/pycharm/ Pycharm社区版是免费的,但没有集成Django相关的功能
Django:https://www.djangoproject.com/
作为学习用的话就尽量下载最新版,如果作为实际开发用的话就下载稳定版
三、部署
1.新建一个工程
- 勾选Enable Django admin,方便以后直接通过web方式管理数据库
- 输入Application name,这样IDEA会自动帮我们创建一个应用。如果这里忘记填写,之后还可以在项目目录运行cmd命令:manage.py startapp [appname]来创建一个应用
- 数据库类型选用sqlite,可以根据需要自行选择
整个项目目录结构如下:
项目:
settings.py:整个项目的相关配置
urls.py:全局的URL配置
应用:
model.py:实体类在这个地方进行声明,MTV中的M
views.py:业务逻辑写在这个地方,MTV中的V(类似MVC中的C)
templates:模板文件夹,MTV中的T(MVC中的V)
对于初学者来说,修改添加的地方大多是这些文件(夹)
最后点击右上角的运行按钮即可(默认是8000端口,可以自行修改)
tip:如果说电脑安装了多个版本的python,记得将安装了django的python文件夹设置在系统的环境变量中,或者自行在项目目录下打开cmd运行命令(管理员权限):
网址输入127.0.0.1:8000就可以看到初始界面了
四、MTV–Model(模型)
web服务往往都会使用到数据库的服务,而我们在使用Django框架中需要完成下面几项即可。
- 创建数据模型
- 配置数据库
- 创建表
之后对于数据库的操作我们都可以通过admin页面来完成
4.1 创建数据模型
Django中会根据你在应用的models.py里面定义的类来自动建立数据库的表,我们只需要在里面定义好我们的数据模型就好。
例如我们要对51job上的岗位信息进行存储,需要保存的字段有:职位名、公司名、工作地点、薪资。
需要修改两个地方的文件 models.py 和 admin.py
# models.py
from django.db import models
# -*- coding: utf-8 -*-
def decode(info):#防止添加中文字符出错
return info.decode('utf-8')
# Create your models here.
class Job(models.Model):#django会自动对没有AutoField的表建立一个id字段当做逻辑主键
jobName = models.CharField(max_length=100)# 职位名
companyName = models.CharField(max_length=100) #公司名
workPlace = models.CharField(max_length=20) # 工作地点
minSalary = models.IntegerField(default=0) # 薪资最小值
maxSalary = models.IntegerField(default=0) # 薪资最大值
# admin.py
from django.contrib import admin
from JobCrawler import models
# Register your models here.
admin.site.register(models.Job)
字段对应类型可以参考 https://www.cnblogs.com/maociping/p/5255834.html ,某些不确定或没有的类型可以自行查看源码(可能由于版本原因导致)
4.2 配置数据库
为了方便起见,之前在项目创建时选用了sqlite,选定了之后IDEA/Pycharm会自动配置好
# settings.py
# 更多数据库配置:https://docs.djangoproject.com/en/dev/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
4.3 创建表
在项目路径下用管理员权限运行cmd,运行以下命令:
Django1.9-:
python manage.py syncdb
Django 1.9+
python manage.py migrate
python manage.py makemigrations
之后需要你创建一个新的管理员用户
python manage.py createsuperuser
按照提示弄就好
使用刚刚创建好账户就可以访问 http://127.0.0.1:8000/admin/ 了
五、MTV–View(视图)
Django的views.py中主要是写后台逻辑,为了验证在视图中能否对数据库进行操作,我们先手动在admin中往数据库添加记录。
5.1 创建视图函数
先测试输出Hello World: http://127.0.0.1:8000/job/
在 views.py 中我们先定义一个函数,用以输出文字Hello World
# views.py
from django.shortcuts import render
from django.shortcuts import HttpResponse
# Create your views here.
def job(request):
return HttpResponse("Hello World");
之后我们在 urls.py 里定义好url和处理函数的对应关系
# urls.py
from django.contrib import admin
from django.urls import path
from JobCrawler import views
urlpatterns = [
path('admin/', admin.site.urls),
path('job/', views.job),#第一个参数是浏览器路径,第二个参数是views.py中对应的函数名
]
关于urlpatterns,还有2种书写方式
(具体描述链接:https://docs.djangoproject.com/en/dev/topics/http/urls/)
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
访问 http://127.0.0.1:8000/job/ 就可以了
5.2 访问数据库
接下来加点内容,希望能够通过get请求获取想要的数据库信息。
例如:通过浏览器访问 http://127.0.0.1:8000/job/?queryStr=alibaba 查询第一条公司名为alibaba的工作的相关信息
from django.shortcuts import render
from django.shortcuts import HttpResponse
from JobCrawler.models import Job
def job(request):
if(request.method == "GET"):#处理GET方法
if(request.GET.get("queryStr") == None):
return HttpResponse("Query string is none!")
else:
job = Job.objects.filter(companyName=request.GET.get("queryStr"))
if len(job) == 0:
return HttpResponse("Query Result is empty")
else:
result = job.all()[0]
return HttpResponse("id:"+str(result.id) +"<br>minSalary:" + str(result.minSalary)+"<br>maxSalary:" + str(result.maxSalary)+"<br>workPlace:" + result.workPlace+"<br>jobName:" + result.jobName)
return HttpResponse("Do Nothing")
ok,访问 http://127.0.0.1:8000/job/?queryStr=alibaba
关于Django剩余的数据库CRUD操作基本类似,可以参考下面链接:
http://www.runoob.com/django/django-model.html
六、MTV–Template(模板)
这部分主要讲解的是Django对静态文件(CSS、JS之类)的引用以及动态数据的添加,需要补HTML(5)的知识可以参考下面链接:
http://www.runoob.com/html/html5-intro.html
在这个项目中,我们添加两个HTML文件:query.html和result.html,用于查询和展示数据库的相关信息
6.1 静态文件的引用
- 在项目目录下创建 assets 文件夹
- 在 setting.py 中配置STATICFILE_DIR信息
# setting.py
STATIC_URL = '/static/' #template中调用静态资源的起始URL
STATICFILES_DIRS=(#注意名字,不要写错
os.path.join(BASE_DIR,'assets')#指定静态文件资源在 BASE_DIR/assets下找
)
- 在templates/query.html中调用静态文件资源
为了测试jquery是否引入成功,使用js代码修改input[type=‘submit’]的值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>TestQuery</title>
</head>
<script src="/static/js/jquery-1.10.2.min.js"></script>
<script>
$(document).ready(function(){
$("#submit").val("提交");
});
</script>
<body>
<form action="/job/" method="get">{% csrf_token %}
<div><label>companyName:</label><input name="queryStr" type="text"></div>
<div><input type="submit" value="submit!!" id="submit"></div>
</form>
</body>
</html>
csrf_token是Django用于防止CSRF(跨站点请求伪造)攻击,对于POST请求是必须要加的。我们此处用的是GET的请求,所以{% csrf_token %}去掉也不会报错,如果要改成POST请求就将上面的HTML代码的get改成post。
成功调用静态资源后的页面如下:
6.2 动态数据的添加
- 新建templates/result.html并添加相关的模板标签,关于模板标签,可以参考:
http://www.runoob.com/django/django-template.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>TestResult</title>
</head>
<body>
<ul>
<li>id:{{ id }}</li>
<li>minSalary:{{ minSalary }}</li>
<li>maxSalary:{{ maxSalary }}</li>
<li>workPlace:{{ workPlace }}</li>
<li>jobName:{{ jobName }}</li>
</ul>
</body>
</html>
- 修改views.job逻辑
from django.shortcuts import render
from django.shortcuts import HttpResponse
# Create your views here.
from JobCrawler.models import Job
def query(request):
return render(request,"query.html")
def job(request):
if(request.method == "GET"):#处理GET方法
if(request.GET.get("queryStr") == None):
return HttpResponse("Query string is none!")
else:
job = Job.objects.filter(companyName=request.GET.get("queryStr"))
if len(job) == 0:
return HttpResponse("Query Result is empty")
else:
return render(request,"result.html",context=job.all()[0].__dict__)
return HttpResponse("Do Nothing")
最终的访问HTML如下:
七、总结
- 本篇文章展示的Django是基于开发环境的,若用于实际部署环境的话会略有不同
- 这次的Django上手比较简单,这不仅仅是因为Python相对简单,而且IDE提供的帮助是不可或缺的
Demo:https://gitee.com/chinastraw/django_demo
参考文献/博客链接:
Python核心编程(第3版)
菜鸟教程:http://www.runoob.com/django/django-tutorial.html
Django新手图文教程:http://www.cnblogs.com/Leo_wl/p/5824541.html