怎样建设网站卖农产品,网络营销的特点包括什么,网页链接 提取码:qqcd,丁香人才网官方网站文章目录Django框架项目开发1. 创建项目2. 项目目录结构3. 视图函数#xff08;view#xff09;4. 路由配置url5. HTTP请求6. HTTP响应 - 状态吗7. GET方式传参8. POST传递参数模板Templates1. 通过 loader 获取模板,通过HttpResponse进行响应2. 使用 render() 直接加载并响应…
文章目录Django框架项目开发1. 创建项目2. 项目目录结构3. 视图函数view4. 路由配置url5. HTTP请求6. HTTP响应 - 状态吗7. GET方式传参8. POST传递参数模板Templates1. 通过 loader 获取模板,通过HttpResponse进行响应2. 使用 render() 直接加载并响应模板Django模板语言1. 模板的传惨2. 模板的变量3. 模板的标签4. 过滤器5. 模板的继承Django中的应用app1. 创建应用app2. 应用的分布式路由数据库和模型1. mysql数据库的配置2. 模型Models3. ORM框架4. 示例5. 字段类型6. 字段选项数据库的基本操作1. 管理器对象2. 新增数据3. 查询数据table_name.objects.查询接口4. 修改数据5. 删除数据admin后天数据管理cookies和sessioncookiessession 会话控制缓存1. 数据库缓存2. 文件系统缓存3. 本地内存缓存4. Django中使用缓存中间件 Middleware1. 中间件类2. 编写中间件类3. 注册中间件跨站请求伪造保护 CSRFDjango框架 一个重量级的python web框架Django配备了常用的大部分组建 MVC设计模式模型层/视图层/控制层 基本配置路由系统原生HTML模板系统视图viewModel模型数据库连接和ORM数据库管理中间件Cookie Seesion分页数据库后台管理系统admin
项目开发
1. 创建项目
django-admin startproject myproject2. 项目目录结构
myproject/
|- manage.py
|- myproject|- __init.py__|- settings.py|- urls.py|- wsgi.pymanage.py项目的主程序 python3 manage.py runserver 启动服务python3 manage.py startapp 创建应用python3 manage.py migrate 数据库迁移 myproject项目包文件夹 __init__.py包初始化文件wigs.pyWEB服务网关接口的配置文件仅部署项目时使用urls.py项目的基础路由配置文件settings.pyDjango的配置文件启动服务时自动调用
3. 视图函数view 视图函数是用于接受一个浏览器请求并通过HttpResponse对象返回数据的函数。 # file : 项目名/views.py
from django.http import HttpResponse
def page1_view(request):html h1这是第1个页面/h1return HttpResponse(html)4. 路由配置url settings.py中的ROOT_URLCONF指定了主路由配置列表urlpatterns的文件位置 ROOT_URLCONF dadashop.urlsurls.py主路由配置文件 urlpatterns是一个路由-视图函数映射关系的列表此列表的映射关系由url函数来确定 主路由配置文件可以不处理用户具体路由即做路由的分发分布式请求处理具体的请求由各自的应用来进行处理。 from django.conf.urls import url, include
from django.contrib import adminurlpatterns [url(r^admin, admin.site.urls),url(r^v1/users, include(user.urls))url(r^person/(?Pname\w)/(?Page\d{1,2}),views.person_view)
]url()函数 用于描述路由与视图函数的对应关系 from django.conf.urls import url, include url(regex, views, nameNone) regex:字符串类型匹配的请求路径允许是正则表达式view:指定路径所对应的视图处理函数的名称name:为地址起别名在模板中地址反向解析时使用 带有分组的路由和视图函数 在视图函数中可以用正则表达式分组 () 提取参数后用函数位置传参传递给视图函数 一个分组表示一个参数,多个参数需要使用多个分组,并且使用个/隔开 带有命名分组的路由和视图函数 在url 的正则表达式中可以使用命名分组(捕获分组) 在视图函数内可以用正则表达式分组 (?Pnamepattern) 提取参数后用函数关键字传参传递给视图函数 url(r^person/(?Pname\w)/(?Page\d{1,2}),views.person_view)url反向解析 url反向解析是指在视图或模板中用为url定义的名称来查找或计算出响应的路由 url(regex, views, kwargsNone, name“别名”)
5. HTTP请求 HTTP1.0定义了三种请求方法 GET, POST 和 HEAD方法(最常用) HTTP1.1新增了五种请求方法OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。 HttpRequest对象
6. HTTP响应 - 状态吗 Django中的响应对象HttpResponse HttpResponse(content响应体, content_type响应体数据类型, status状态码)content_type响应体数据类型 text/html默认的html文件text/plain纯文本text/csscss文件text/javascriptjs文件multipart/form-data文件提交application/jsonjson传输application/xmlxml文件
7. GET方式传参 通过查询字符串将数据传递给服务器 URL格式xxx?name1value1name2value2服务器端接受数据 判断request.method的值判断请求方法是否是get请求 if request.method GET处理GET请求时的业务逻辑
else:处理其它请求的业务逻辑获取客户端GET请求提交的数据 request.GET[参数名]
request.GET.get[参数名, 默认值]
request.GET.getlist(参数名)8. POST传递参数 客户端通过表单等POST请求将数据传递给服务器端 服务器端接受数据 判断request.method的值判断请求方法是否是POST请求 if request.method POST处理POST请求时的业务逻辑
else:处理其它请求的业务逻辑使用post方式接收客户端数据 request.POST[参数名]
request.POST.get[参数名, 默认值]
request.POST.getlist(参数名)模板Templates 模板是可以根据字典数据动态变化的html网页 模板可以根据视图中传递的字典数据动态生成相应的HTML网页。 1. 通过 loader 获取模板,通过HttpResponse进行响应
from django.template import loader
# 1.通过loader加载模板
t loader.get_template(模板文件名)
# 2.将t转换成 HTML 字符串
html t.render(字典数据)
# 3.用响应对象将转换的字符串内容返回给浏览器
return HttpResponse(html)2. 使用 render() 直接加载并响应模板
from django.shortcuts import render
return render(request,模板文件名, 字典数据)Django模板语言
1. 模板的传惨
2. 模板的变量
3. 模板的标签
4. 过滤器
5. 模板的继承
Django中的应用app
1. 创建应用app
python3 manage.py startapp app_namedjango应用的结构组成 migrations 文件夹 保存数据迁移的中间文件 __init__.py 应用子包的初始化文件 admin.py 应用的后台管理配置文件 apps.py 应用的属性配置文件 models.py 与数据库相关的模型映射类文件 tests.py 应用的单元测试文件 views.py 定义视图处理函数的文件 配置安装应用 在 settings.py 中配置应用, 让此应用能和整个项目融为一体 # file : settings.py
INSTALLED_APPS [... ...,app_name
]2. 应用的分布式路由 include函数 # urls.py主路由配置文件from django.conf.urls import url, include
from django.contrib import admin# include(app命字.url模块名)
urlpatterns [url(r^admin, admin.site.urls),url(r^v1/users, include(user.urls))
]应用中的路由urls.py配置文件 from django.conf.urls import url
from . import viewsurlpatterns [url(r^$, views.Class_name.as_view()),
]数据库和模型
1. mysql数据库的配置 安装pymysql用作Python和mysql的接口 创建数据库create database 数据库名 default charset utf8 ; setting.py中的mysql相关配置 DATABASES {default : {ENGINE: django.db.backends.mysql,NAME: mywebdb, # 数据库名称,需要自己定义USER: root,PASSWORD: 123456, # 管理员密码HOST: 127.0.0.1,PORT: 3306,}
}2. 模型Models
模型是一个Python类它是由django.db.models.Model派生出的子类一个模型类代表数据库中的一张数据表模型类中每一个类属性都代表数据库中的一个字段模型是数据交互的接口是表示和操作数据库的方法和方式
3. ORM框架 ORMObject Relational Mapping即对象关系映射。它是一种程序技术允许使用类和对象对数据库进行操作从而避免通过SQL语句操作数据库。 作用 建立模型类和表之间的对应关系允许我们通过面向对象的方式来操作数据库根据设计的模型类生成数据库中的表格通过简单的配置就可以进行数据库的切换 优点 只需要面向对象编程不需要面向数据库编写代码 对数据库的操作都转化成对类属性和方法的操作 不用编写各种数据库的sql语句 实现了数据模型与数据库的解耦屏蔽了不同数据库操作上的差异 不在关注用的是mysql/oracle…等数据库的内部细节 通过简单的配置就可以轻松更换数据库不需要修改代码 缺点相比直接使用SQL语句操作数据库性能上有损失
4. 示例 新建app python3 manage.py startapp bookstoremodels.py中添加模型类 # file : bookstore/models.py
from django.db import models# Create your models here.
class Book(models.Model):title models.CharField(书名,max_length50,default, uniqueTrue)#00000.00price models.DecimalField(定价, max_digits7,decimal_places2, default0.0)#新添字段时记住加default值pub models.CharField(出版社, max_length200, default)market_price models.DecimalField(零售价, max_digits7, decimal_places2, default0.0)class Mata:db_table Book_massage # 自定义数据库表名def __str__(self):return %s_%s_%s_%s%(self.title,self.price,self.pub,self.market_price)在setting.py中注册app # file : setting.py
INSTALLED_APPS [...bookstore,
]数据库迁移 迁移是Django同步你对模型所做的更改添加字段、删除模型等到数据库的方式 生成或更新迁移文件 在每个应用下的models.py文件生成一个中间文件 python3 manage.py makemigrations执行迁移脚本程序 目的是将每个应用下的migrations.py目录中的中间文件同步到数据库 python3 manage.py migrate5. 字段类型 BooleanField() 数据库类型:tinyint(1)编程语言中:使用True或False来表示值在数据库中:使用1或0来表示具体的值 CharField() 数据库类型:varchar注意: 必须要指定max_length参数值 DateField() 数据库类型:date作用:表示日期编程语言中:使用字符串来表示具体值参数: DateField.auto_now: 每次保存对象时自动设置该字段为当前时间(取值:True/False)。DateField.auto_now_add: 当对象第一次被创建时自动设置当前时间(取值:True/False)。DateField.default: 设置当前时间(取值:字符串格式时间如: ‘2019-6-1’)。以上三个参数只能多选一 DateTimeField() 数据库类型:datetime(6)作用:表示日期和时间auto_now_addTrue DecimalField() 数据库类型:decimal(x,y) 编程语言中:使用小数表示该列的值 在数据库中:使用小数 参数: DecimalField.max_digits: 位数总数包括小数点后的位数。 该值必须大于等于decimal_places.DecimalField.decimal_places: 小数点后的数字数量 示例: moneymodels.DecimalField(max_digits7,decimal_places2,default0.0
)FloatField() 数据库类型:double编程语言中和数据库中都使用小数表示值 EmailField() 数据库类型:varchar编程语言和数据库中使用字符串 IntegerField() 数据库类型:int编程语言和数据库中使用整数 URLField() 数据库类型:varchar(200)编程语言和数据库中使用字符串 ImageField()
数据库类型:varchar(100)作用:在数据库中为了保存图片的路径编程语言和数据库中使用字符串示例:imagemodels.ImageField(upload_tostatic/images
)upload_to:指定图片的上传路径 在后台上传时会自动的将文件保存在指定的目录下
TextField() 数据库类型:longtext作用:表示不定长的字符数据
6. 字段选项 指定创建的列的额外的信息允许出现多个字段选项用,隔开。 primary_key 如果设置为True,表示该列为主键,如果指定一个字段为主键则此数库表不会创建id字段 blank 设置为True时字段可以为空。设置为False时字段是必须填写的。 null 如果设置为True,表示该列值允许为空。默认为False,如果此选项为False建议加入default选项来设置默认值 default 设置所在列的默认值,如果字段选项nullFalse建议添加此项 db_index 如果设置为True,表示为该列增加索引 unique 如果设置为True,表示该字段在数据库中的值必须是唯一(不能重复出现的) db_column 指定列的名称,如果不指定的话则采用属性名作为列名 verbose_name 设置此字段在admin界面上的显示名称。
示例:# 创建一个属性,表示用户名称,长度30个字符,必须是唯一的,不能为空,添加索引
name models.CharField(max_length30, uniqueTrue, nullFalse, db_indexTrue)数据库的基本操作 数据库的基本操作包括增删改查操作 1. 管理器对象 每个继承子models.Model的模型类都会有一个objects对象被同样继承下来即管理器对象。 作用是实现数据库的增删改查操作 2. 新增数据 创建数据中每一条记录就是创建一个数据对象 MyModel.objects.create(属性1值1, 属性2值1,…)创建 MyModel 实例对象,并调用 save() 进行保存
obj MyModel(属性值,属性值)
obj.属性值
obj.save()3. 查询数据table_name.objects.查询接口 查询接口 说明方法查询全部记录返回QuerySet查询对象all()查询符合条件的单一记录get(条件判断)查询符合条件的多条记录filter()查询符合条件之外的全部记录exclude()排除 all()方法MyModel.objects.all() 查询MyModel实体中所有的数据返回QuerySet容器对象,内部存放 MyModel 实例 等同于select * from table from bookstore import modelsbooks models.Book.objects.all()
for book in books:print(书名, book.title, 出版社:, book.pub)get()方法MyModel.objects.get(条件) 返回满足条件的唯一一条数据返回MyModel对象 from bookstore import models
book models.Book.objects.get(id1)print(book.title)filter()方法MyModel.objects.filter(字段__条件) __exact : 等值匹配 exact(准确的、精确的) Author.objects.filter(id__exact1)
# 等同于select * from author where id 1__contains : 包含指定值 Author.objects.filter(name__containsw)
# 等同于 select * from author where name like %w%__startswith : 以 XXX 开始 __endswith : 以 XXX 结束 __gt : 大于指定值 Author.objects.filer(age__gt50)
# 等同于 select * from author where age 50__gte : 大于等于 __lt : 小于 __lte : 小于等于 __in : 查找数据是否在指定范围内 Author.objects.filter(country__in[中国,日本,韩国])
# 等同于 select * from author where country in (中国,日本,韩国)__range: 查找数据是否在指定的区间范围内 # 查找年龄在某一区间内的所有作者
Author.objects.filter(age__range(35,50))
# 等同于 SELECT ... WHERE Author BETWEEN 35 and 50;exclude()方法MyModel.objects.exclude(条件) 返回不包含此 条件 的 全部的数据集 books models.Book.objects.exclude(pub清华大学出版社, price__gt50)
for book in books:print(book)4. 修改数据 修改单个实体的某个字段值的步骤 查通过get()得到要修改的实体对象改通过对象.属性 的方式修改数据保存通过对象.save() 保存数据 from bookstore import models
abook models.Book.objects.get(id10)
abook.market_price 10.5
abook.save()通过QuerySet批量修改对应的全部字段MyModel.update(属性值) 直接调用QuerySet的update(属性值) 实现批量修改 # 将 id大于3的所有图书价格定为0元
from bookstore import models
books models.Book.objects.filter(id__gt3)
books.update(price0)
# 将所有书的零售价定为100元
books Book.objects.all()
books.update(market_price100)5. 删除数据 删除单个MyModel对象或删除一个查询结果集(QuerySet)中的全部对象都是调用 delete()方法 删除单个对象 查找查询结果对应的一个数据对象调用这个数据对象的delete()方法实现删除 from bookstore import models
book models.Book.objects.get(id1)
book.delete()删除查询结果集 查找查询的结果集中满足条件的全部QuerySet查询集合对象调用查询集合对象的delete()方法实现删除 # 删除全部作者中年龄大于65的全部信息
auths Author.objects.filter(age__gt65)
auths.delete()admin后天数据管理 django会收集所有已注册的模型类为这些模型类提供管理界面供开发者使用 创建后台管理账号 python3 manage.py createsuperuser用注册的账号登录后台管理界面 在终端启动django服务python3 manage.py runserver 127.0.0.1:8000后台管理的登录地址http://127.0.0.1:8000/admin
cookies和session
cookies cookies是保存在客户端浏览器上的存储空间通常用来记录浏览器端自己的信息和当前连接的确认信息 cookies在浏览器上是以键-值对的形式进行存储键和值都是以ASCII字符串的形式存储 cookies内部的数据会在每次访问此网址时都会携带到服务器端 在Django服务器端来设置浏览器的cookies必须通过HttpResponse对象来完成 添加、修改COOKIE HttpRespone.set_cookie(key, value, max_ageNone, expiresNone)key: cookie的名字value: cookie的值max_age: cookie存活时间秒为单位expires: 具体过期时间当不指定max_age和expires时关闭浏览器时此数据失效 删除COOKIE # HttpResponse.delete_cookie(key)responds HttpResponse(已删除 my_var1)
responds.delete_cookie(my_var1)django中的对象 使用相应对象HttpRsponse将cookie保存到客户端 from django.http import HttpResponse
resp HttpResponse()
resp.set_cookie(cookies名, cookies值, 超期时间)使用render对象将cookie保存到客户端 from django.shortcuts import render
resp render(request,xxx.html,locals())
resp.set_cookie(cookies名, cookies值, 超期时间)获取cookie # 通过 request.COOKIES 绑定的字典(dict) 获取客户端的 COOKIES数据
value request.COOKIES.get(cookies名, 没有值!)
print(cookies名 , value)session 会话控制 是在服务器上开辟一段空间用于保留浏览器和服务器交互时的重要数据 session的作用 http协议是无状态的每次请求都是一次新的请求不会记得之前通信的状态实现状态保持的方式在客户端或服务器端存储与会话有关的数据推荐使用sesison方式因为所有数据存储在服务器端数据更加安全 session的实现 使用 session 需要在浏览器客户端启动 cookie且用在cookie中存储sessionid每个客户端都可以在服务器端有一个独立的Session 在django的settings.py中配置Session 向 INSTALLED_APPS 列表中添加 INSTALLED_APPS [# 启用 sessions 应用django.contrib.sessions,
]向 MIDDLEWARE 列表中添加 MIDDLEWARE [# 启用 Session 中间件django.contrib.sessions.middleware.SessionMiddleware,
]SESSION_COOKIE_AGE 作用: 指定sessionid在cookies中的保存时长(默认是2周)如下: SESSION_COOKIE_AGE 60 * 60 * 24 * 7 * 2 SESSION_EXPIRE_AT_BROWSER_CLOSE True 设置只要浏览器关闭时,session就失效(默认为False) 当使用session时需要迁移数据库,否则会出现错误 $ python3 manage.py makemigrations
$ python3 manage.py migrate缓存 Django中提供多种缓存方式如需使用需要在settings.py中进行配置 1. 数据库缓存 Django可以将其缓存的数据存储在您的数据库中 settings.py CACHES {default: {BACKEND: django.core.cache.backends.db.DatabaseCache,LOCATION: my_cache_table,TIMEOUT: 300, #缓存保存时间 单位秒默认值为300, OPTIONS:{MAX_ENTRIES: 300, #缓存最大数据条数CULL_FREQUENCY: 2,#缓存条数达到最大值时 删除1/x的缓存数据}}
}view.py from django.views.decorators.cache import cache_pagecache_page(30)
def test_cache(request):# time.sleep(3)t1 time.time()return HttpResponse(t1 is %s%(t1))# return render(request, test_cache.html, locals())床架你缓存表 python3 manage.py createcachetable2. 文件系统缓存
CACHES {default: {BACKEND: django.core.cache.backends.filebased.FileBasedCache,LOCATION: /var/tmp/django_cache,#这个是文件夹的路径#LOCATION: c:\test\cache,#windows下示例}
}3. 本地内存缓存
CACHES {default: {BACKEND: django.core.cache.backends.locmem.LocMemCache,LOCATION: unique-snowflake}
}4. Django中使用缓存 在视图view中使用cache from django.views.decorators.cache import cache_pagecache_page(30) - 单位s
def my_view(request):...在路由中使用 from django.views.decorators.cache import cache_pageurlpatterns [path(foo/, cache_page(60)(my_view)),
]在模板中使用 {% load cache %}
{% cache 500 sidebar request.user.username %}.. sidebar for logged in user ..
{% endcache %}中间件 Middleware 中间件是 Django 请求/响应处理的钩子框架。它是一个轻量级的、低级的“插件”系统用于全局改变 Django 的输入或输出。 每个中间件组件负责做一些特定的功能。 1. 中间件类
中间件类须继承自 django.utils.deprecation.MiddlewareMixin类中间件类须实现下列五个方法中的一个或多个: def process_request(self, request): 执行路由之前被调用在每个请求上调用返回None或HttpResponse对象def process_view(self, request, callback, callback_args, callback_kwargs): 调用视图之前被调用在每个请求上调用返回None或HttpResponse对象def process_response(self, request, response): 所有响应返回浏览器 被调用在每个请求上调用返回HttpResponse对象def process_exception(self, request, exception): 当处理过程中抛出异常时调用返回一个HttpResponse对象def process_template_response(self, request, response): 在视图函数执行完毕且试图返回的对象中包含render方法时被调用该方法需要返回实现了render方法的响应对象 注 中间件中的大多数方法在返回None时表示忽略当前操作进入下一项事件当返回HttpResponese对象时表示此请求结束直接返回给客户端
2. 编写中间件类
# file : middleware/mymiddleware.py
from django.http import HttpResponse, Http404
from django.utils.deprecation import MiddlewareMixinclass MyMiddleWare(MiddlewareMixin):def process_request(self, request):print(中间件方法 process_request 被调用)def process_view(self, request, callback, callback_args, callback_kwargs):print(中间件方法 process_view 被调用)def process_response(self, request, response):print(中间件方法 process_response 被调用)return responsedef process_exception(self, request, exception):print(中间件方法 process_exception 被调用)def process_template_response(self, request, response):print(中间件方法 process_template_response 被调用)return response3. 注册中间件
# file : settings.py
MIDDLEWARE [...]跨站请求伪造保护 CSRF 跨站请求伪造攻击 某些恶意网站上包含链接、表单按钮或者JavaScript它们会利用登录过的用户在浏览器中的认证信息试图在你的网站上完成某些操作这就是跨站请求伪造(CSRF即Cross-Site Request Forgey)。 CSRF中间件和模板标签提供对跨站请求伪造简单易用的防护。 CSRF的作用不让其它表单提交到此Django服务器 解决方案 取消csrf验证 删除 settings.py 中 MIDDLEWARE 中的 django.middleware.csrf.CsrfViewMiddleware 的中间件 通过验证csrf_token验证 需要在表单中增加一个标签 {% csrf_token %}