利用Django开发个小型商城(一)
利用Django开发个小型商城
我们本期的教程是教大家如何利用Django开发一个小型的商城,这里所说的小型商城只是功能上的简朴。
作者:黄志成(小黄)
作者博客:博客地址
前提
1.了解基本的Python3语法
2.会使用百度
这里我们不讲最基础的语法部分,如果没有基础的朋友,建议先了解基础.
当然对有基础的朋友,也有要求就是会使用百度来解决问题.为什么这么说?
很多时候新手遇到的问题 90% 都是在百度上能搜索到的. 遇到问题的第一时刻应该仔细思考,然后在去百度,如果百度上的答案不能理解,要么是你的基本功还是不扎实,另外就是答案是不对,或者没有表达清楚,这个时候 你可以去一些编程社区去求助.
Django 简介
1.Django是什么?
Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,模板T和视图V。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。
Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django
当然python的web框架有很多 例如: Tornado、flask、web2py 等等.
各有优点.像Django就是一个重量级的框架,他将很多功能都集成好了,开发很便捷.适合入门学习.
下面用一张图来说明什么是Django:
这部电影相信大家都看过,这是传说中要你命3000.我们的Django框架和它一样.是一个很全的工具.用Django 我们可以快速开发出一个web APP.
2.MTV又是什么?
Model(模型):用于封装与应用程序的业务逻辑相关的数据及对数据的处理方法,是Web应用程序中用于处理应用程序的数据逻辑的部分,Model只提供功能性的接口,通过这些接口可以获取Model的所有功能。白话说,这个模块就是Web框架和数据库的交互层。
Template(模板):将数据与HTML语言结合起来的引擎
View(视图): 负责实际的业务逻辑实现
Django的安装
Django是python编写的web框架,依赖于python 这里我们使用python3.6,使用的Django版本是2.0 ,这里2.0版本不在兼容python2.7
这里我们通过pip安装Django
pip3 install django==2.0
这里指定安装Django的2.0版本
安装完成之后,如何验证是否安装成功呢? 这里我们通过pip查看已安装的包
pip3 list
当然还有一种方法 ,在python环境下运行下面代码获取django的版本号.
>>> import django
>>> django.get_version()
'2.0'
django的安装其实很简单.下面我们将一步一步的创建一个商城项目.
Django的项目创建
在我们安装好Django之后,我们的环境变量中会有一个 django-admin
在命令行下面输入 django-admin help 如果正常的话 会出现如下界面:
既然一切正常,我们就开始创建第一个Django的项目吧.
通过下面的命令就可以创建一个 名称为 fresh的项目
django-admin startproject fresh
下面是通过此命令创建的目录结构.
├── fresh
│ ├── __init__.py
│ ├── settings.py (项目配置文件)
│ ├── urls.py (项目路由)
│ └── wsgi.py (python网关)
├── manage.py (脚手架)
├── db.sqlite3 (数据库)
└── templates (模板目录)
当然我们也可以通过IDE创建Django项目 (这里我们使用PyCharm)
点击 Create 就能创建出一个Django的项目,其实IDE也是底层调用 django-admin的方法创建项目.创建出的文件都是一样的.
这个时候我们运行一下我们项目试试,可以通过内置的服务器启动项目
python3 manage.py runserver 8000
这就启动成功了. 我们 打开浏览器访问 http://127.0.0.1:8000/
显示这样的,我们就很顺利的创建了一个项目.当然启动时报出的红色错误信息,我们会在后面来和大家解释.
在创建第一个应用之前我们先了解一下 Django的配置文件 settings
.py
在Django中默认使用的数据库是sqlite.在实际的业务中并不常用,这里我们使用mysql.当然如果对数据库这里不太了解的同学,建议先去学习一下数据库相关的知识.
那如何将数据库引擎换成mysql呢?
# 这段代码在 settings.py的 76行
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
将这段改为:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1',
'PORT':'3306',
'USER':'root',
'PASSWORD':'root',
'NAME':'fresh',
}
}
我们试着运行一下,可能会报一个错误
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
因为在 Django 中, 连接数据库时使用的是 MySQLdb 库,这在与 python3 的合作中就会报上面的错误了.
如何解决呢?
1.在 python3 中,改变了连接库,改为了 pymysql 库,使用pip install pymysql 进行安装
2.然后在 init.py 文件中添加以下代码即可
import pymysql
pymysql.install_as_MySQLdb()
Django支持的数据库有这几种:
'django.db.backends.postgresql'
'django.db.backends.mysql'
'django.db.backends.sqlite3'
'django.db.backends.oracle'
这节的最后说下我们的静态页面和静态文件(CSS,JS,IMG)存放位置吧.
在setting.py的最后有如下代码.告诉我们文件存放位置.
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
TEMPLATE_DIRS = (os.path.join(BASE_DIR, 'templates'),)
静态文件 存在 static 目录下. 可能在创建项目的时候 没有自动帮我们创建static文件夹,需要自己手动创建一下,创建在和manage.py同级目录。
静态页面存放在 templates 下.
创建第一个应用
对于很多初学的同学,就有一个疑问? 项目和应用有着什么样的关联和区别.
- 一个app实现某个功能或者模块,比如用户模块,订单模块;
-
一个project是配置文件和多个app的集合,这些app组合成整个站点;
-
一个project可以包含多个app;
我们来创建第一应用:用户模块 ,用于用户的登录,注册。
python3 manage.py startapp user
创建完应用,我们来设计模型类。
在user文件夹下有一个models.py的文件,这里就是模型类.在这里我们先定义我们的字段.
class User(models.Model):
uid = models.AutoField(primary_key=True)
uname = models.CharField(max_length=20)
upwd = models.CharField(max_length=32)
create_at = models.DateField()
update_at = models.DateField()
定义完字段后,就可以进行迁移了.迁移方式在下方写着.
#创建数据迁移文件
python3 manage.py makemigrations
#如果出现 No changes detected ,可能是你没有把应用添加到 setting.py中的 INSTALLED_APPS , 应用名是 'user'
#生成
python3 manage.py migrate
生成表后在数据库中一看.表名是:user_user 这和我们想的不太一样.
那如何修改成user呢.
#在User类中添加 Meta类
class User(models.Model):
uid = models.AutoField(primary_key=True)
uname = models.CharField(max_length=20)
upwd = models.CharField(max_length=32)
create_at = models.DateField()
update_at = models.DateField()
class Meta:
db_table = 'user'
第一步:
进入数据库,找到django_migrations的表,删除该app名字对应的所有记录。
第二步:
删除该app名字下的migrations下的除了init.py之外的文件。
第三步:
重新运行迁移命令.
数据表创建好了,现在需要我们的页面了,Django如何载入页面呢?
在view.py文件下就可以创建咱们的视图逻辑了.
这里咱们使用类的方式来写,当然也可以用函数的方式来写 这里我更推荐使用类的方式.
- 用户访问浏览器,一般两种方式,get获取网页和post提交数据,get也可以提交数据,以一种明文形式显示在url中,post提交的数据url中不显示,一种安全的数据提交方式,get方式提交数据一般应用于一些排序方式和类别过滤中,post用于用户提交的表单数据,比较隐私的数据,get方式提交数据为小数据信息,而post方式提交数据可以是大数据信息
- 导入View基类
- 写一个view类,继承View基类,下面有两个方法,get和post方法
- 在urls中通过类方法.as_view() 方式 调用这个view类
下面给出代码实例:
import json
from django.shortcuts import render,HttpResponse
from django.views.generic.base import View
# Create your views here.
class LoginView(View):
def get(self,request):
# 渲染登录页面
return render(request,'user/login.html')
def post(self,request):
# 登录逻辑
return HttpResponse(json.dumps(request.POST))
class RegisterView(View):
def get(self,request):
return render(request,'user/register.html')
这里先写登录页面和注册页面. 登录的post方法中 在页面先直接输出 POST 的数据.
由于django会有CSRF验证所以我们在提交表单的时候要构建一个csrf的token,这里django提供了方法让我们直接构建出一条token
<form action="" method="post">
{% csrf_token %}
<input type="text" name="username" class="name_input" placeholder="请输入用户名">
<div class="user_error">输入错误</div>
<input type="password" name="pwd" class="pass_input" placeholder="请输入密码">
<div class="pwd_error">输入错误</div>
<div class="more_input clearfix">
<input type="checkbox" name="">
<label>记住用户名</label>
<a href="#">忘记密码</a>
</div>
<input type="submit" name="" value="登录" class="input_submit">
</form>
这里说一下 render 和 HttpResponse函数的作用.
render是渲染变量到模板中,render的第一个参数是request 第二个参数是模板路径 第三个参数context是要传入文件中用于渲染呈现的数据, 默认是字典格式
HttpResponse是不调用模板,直接返回数据
最后我们需要添加路由, 路由是关联url及其处理函数关系的过程
在 user 模块下 新建urls.py文件
from django.urls import path
from user.views import LoginView,RegisterView
urlpatterns = [
path(r'user_login/',LoginView.as_view(),name='login'),
path(r'user_register/',RegisterView.as_view(),name='register')
]
最后在项目的urls.py文件中引入 user模块的路由
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('',include('user.urls')),
]
下一节,我们开始讲解django的模型,来完善我们的用户模块.实现用户登录注册的功能。
jay
good
May
best