一, 虚拟环境安装
虚拟环境用来解决版本共存:
, 用 pycharm 选择 virtualenv 创建一个纯净环境
, 将环境 copy 到需要长期使用的文件夹下
, 再次创建项目时, 将该环境添加到 pycharm 环境选择中
, 为该环境添加需要处理的版本共存包
'''
1. 通过 pip3 安装虚拟环境:
-- pip3 install virtualenv
2. 前往目标文件夹:
-- cd 目标文件夹 (C:\Virtualenv)
3. 创建纯净虚拟环境:
-- virtualenv 虚拟环境名 (py3-env1)
了解: 创建非纯净环境:
-- virtualenv-clone 本地环境 虚拟环境名
4. 终端启动虚拟环境:
-- cd py3-env1\Scripts
-- activate
5. 进入虚拟环境下的 python 开发环境
-- python3
6. 关闭虚拟环境:
-- deactivate
7.PyCharm 的开发配置
添加: 创建项目 -> Project Interpreter -> Existing interpreter -> Virtualenv Environment | System Interpreter -> 目标路径下的 python.exe
删除: Setting -> Project -> Project Interpreter -> Show All
'''
二, 路由配置主页与 404Not found
'''
路由层:
from django.urls import path, re_path
urlpatterns = [
# 主页最上方配置
re_path('^$', root, name="root"),
re_path('^index/$', index),
re_path('^home/$', home),
# 其他路由...
# 404 配在最下方
re_path('/$', error)
]
视图层:
from django.shortcuts import render, redirect, reverse
# 主页
def root(request):
return render(request, 'root.html')
def index(request):
return redirect(reverse('root'))
def home(request):
return redirect(reverse('root'))
# 404
def error(request):
return render(request, 'error.html')
'''
三, Django2.x 版本路由分发
'''
1. 无名称空间
主路由:
path('app01/', include('app01.urls'))
子路由:
path('test/', views.test)
2. 有名称空间
主路由:
path('app01/', include(('app01.urls', 'app01'))),
子路由:
path('test/', views.test, name='test')
模板层:
{% url 'app01:test' %}
'''
四, 伪静态
动态页面: 数据内容会发生变化的页面
静态页面: 数据内容不会发生变化
针对 (SEO) 搜索引擎优化, 静态页面更容易被搜索引擎网站收录
伪静态就是讲动态页面伪装成静态页面, 容易被搜索引擎网站收录, 从而增加搜索概率, 提高流量
'''
路由层:
url('^index/$', views.index),
url('^article/(?P<id>(\d+)).html/$', views.article, name='article')
视图函数层:
def index(request):
return render(request, 'index.html')
def article(request, id):
return render(request, 'article.html', {'id': id})
模板层:
index.html
<a href="{% url'article'1 %}">第一篇文章</a>
<a href="{% url'article'2 %}">第二篇文章</a>
<a href="{% url'article'3 %}">第三篇文章</a>
article.html
<h1 > 第 {{ id }} 篇文章</h1>
'''
五, request 对象
'''
1. method: 请求方式
2. GET: get 请求的参数
3. POST: post 请求的参数(本质是从 bdoy 中取出来)
4. body: post 提交的数据(不能直接查看)
5. path: 请求的路径, 不带参数
6. request.get_full_path(): 请求路径, 带参数
7. FILES: 文件数据
8. encoding: 编码格式
9. META: 数据大汇总的字典
'''
request 属性:
django 将请求报文中的请求行, 首部信息, 内容主体封装成 HttpRequest 类中的属性. 除了特殊说明的之外, 其他均为只读的
- '''
- 1.HttpRequest.GET
- 一个类似于字典的对象, 包含 HTTP GET 的所有参数. 详情请参考 QueryDict 对象.
- 2.HttpRequest.POST
- 一个类似于字典的对象, 如果请求中包含表单数据, 则将这些数据封装成 QueryDict 对象.
- POST 请求可以带有空的 POST 字典 -- 如果通过 HTTP POST 方法发送一个表单, 但是表单中没有任何的数据, QueryDict 对象依然会被创建.
- 因此, 不应该使用 if request.POST 来检查使用的是否是 POST 方法; 应该使用 if request.method == "POST"
- 另外: 如果使用 POST 上传文件的话, 文件信息将包含在 FILES 属性中.
- 注意: 键值对的值是多个的时候, 比如 checkbox 类型的 input 标签, select 标签, 需要用:
- request.POST.getlist("hobby")
- 3.HttpRequest.body
- 一个字符串, 代表请求报文的主体. 在处理非 HTTP 形式的报文时非常有用, 例如: 二进制图片, XML,Json 等.
- 但是, 如果要处理表单数据的时候, 推荐还是使用 HttpRequest.POST .
- 4.HttpRequest.path
- 一个字符串, 表示请求的路径组件(不含域名).
- 例如:"/music/bands/the_beatles/"
- 5.HttpRequest.method
- 一个字符串, 表示请求使用的 HTTP 方法. 必须使用大写.
- 例如:"GET","POST"
- 6.HttpRequest.encoding
- 一个字符串, 表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置, 默认为'utf-8').
- 这个属性是可写的, 你可以修改它来修改访问表单数据使用的编码.
- 接下来对属性的任何访问 (例如从 GET 或 POST 中读取数据) 将使用新的 encoding 值.
- 如果你知道表单数据的编码不是 DEFAULT_CHARSET , 则使用它.
- 7.HttpRequest.META
- 一个标准的 Python 字典, 包含所有的 HTTP 首部. 具体的头部信息取决于客户端和服务器, 下面是一些示例:
- 取值:
- CONTENT_LENGTH -- 请求的正文的长度(是一个字符串).
- CONTENT_TYPE -- 请求的正文的 MIME 类型.
- HTTP_ACCEPT -- 响应可接收的 Content-Type.
- HTTP_ACCEPT_ENCODING -- 响应可接收的编码.
- HTTP_ACCEPT_LANGUAGE -- 响应可接收的语言.
- HTTP_HOST -- 客服端发送的 HTTP Host 头部.
- HTTP_REFERER -- Referring 页面.
- HTTP_USER_AGENT -- 客户端的 user-agent 字符串.
- QUERY_STRING -- 单个字符串形式的查询字符串(未解析过的形式).
- REMOTE_ADDR -- 客户端的 IP 地址.
- REMOTE_HOST -- 客户端的主机名.
- REMOTE_USER -- 服务器认证后的用户.
- REQUEST_METHOD -- 一个字符串, 例如 "GET" 或 "POST".
- SERVER_NAME -- 服务器的主机名.
- SERVER_PORT -- 服务器的端口(是一个字符串).
- 从上面可以看到, 除 CONTENT_LENGTH 和 CONTENT_TYPE 之外, 请求中的任何 HTTP 首部转换为 META 的键时,
- 都会将所有字母大写并将连接符替换为下划线最后加上 HTTP_ 前缀.
- 所以, 一个叫做 X-Bender 的头部将转换成 META 中的 HTTP_X_BENDER 键.
- 8.HttpRequest.FILES
- 一个类似于字典的对象, 包含所有的上传文件信息.
- FILES 中的每个键为 < input type="file" name="" /> 中的 name, 值则为对应的数据.
- 注意, FILES 只有在请求的方法为 POST 且提交的 < form> 带有 enctype="multipart/form-data" 的情况下才会
- 包含数据. 否则, FILES 将为一个空的类似于字典的对象.
- 9.HttpRequest.COOKIES
- 一个标准的 Python 字典, 包含所有的 cookie. 键和值都为字符串.
- 10.HttpRequest.session
- 一个既可读又可写的类似于字典的对象, 表示当前的会话. 只有当 Django 启用会话的支持时才可用.
- 完整的细节参见会话的文档.
- 11.HttpRequest.user(用户认证组件下使用)
- 一个 AUTH_USER_MODEL 类型的对象, 表示当前登录的用户.
- 如果用户当前没有登录, user 将设置为 django.contrib.auth.models.AnonymousUser 的一个实例. 你可以通过 is_authenticated() 区分它们.
- 例如:
- if request.user.is_authenticated():
- # Do something for logged-in users.
- else:
- # Do something for anonymous users.
- user 只有当 Django 启用 AuthenticationMiddleware 中间件时才可用.
- -------------------------------------------------------------------------------------
- 匿名用户
- class models.AnonymousUser
- django.contrib.auth.models.AnonymousUser 类实现了 django.contrib.auth.models.User 接口, 但具有下面几个不同点:
- id 永远为 None.
- username 永远为空字符串.
- get_username() 永远返回空字符串.
- is_staff 和 is_superuser 永远为 False.
- is_active 永远为 False.
- groups 和 user_permissions 永远为空.
- is_anonymous() 返回 True 而不是 False.
- is_authenticated() 返回 False 而不是 True.
- set_password(),check_password(),save() 和 delete() 引发 NotImplementedError.
- New in Django 1.8:
- 新增 AnonymousUser.get_username() 以更好地模拟 django.contrib.auth.models.User.
- */
- request 常用方法
- '''
- 1.HttpRequest.get_full_path()
返回 path, 如果可以将加上查询字符串.
例如:"/music/bands/the_beatles/?print=true"
注意和 path 的区别: http://127.0.0.1:8001/order/?name=lqz&age=10
2.HttpRequest.is_ajax()
如果请求是通过 XMLHttpRequest 发起的, 则返回 True, 方法是检查 HTTP_X_REQUESTED_WITH 相应的首部是否是字符串'XMLHttpRequest'.
大部分现代的 JavaScript 库都会发送这个头部. 如果你编写自己的 XMLHttpRequest 调用(在浏览器端), 你必须手工设置这个值来让 is_ajax() 可以工作.
如果一个响应需要根据请求是否是通过 Ajax 发起的, 并且你正在使用某种形式的缓存例如 Django 的 cache middleware,
你应该使用 vary_on_headers('HTTP_X_REQUESTED_WITH') 装饰你的视图以让响应能够正确地缓存.
'''
六, FBV 与 CBV
CBV 基于类的视图 (Class base view) 和 FBV 基于函数的视图(Function base view)
'''
FBV:function base views 函数方式完成视图响应
CBV:class base views 类方式完成视图响应
''''''
视图层:
- from django.shortcuts import HttpResponse
- from django.views import View
- class CBVView(View):
- def get(self, request):
- return HttpResponse("响应 get 请求")
- def post(self, request):
- return HttpResponse("响应 post 请求")
路由层:
- url('^path/$', views.CBVView.as_views())
- '''
- 七, 文件上传与下载
- '''
前端: upload.HTML 页面
1. 往自身路径发送 post 请求, 要将第四个中间件注释
2.multipart/form-data 格式允许发送文件
3.multiple 属性表示可以多文件操作
- <form action=""method="post"enctype="multipart/form-data">
- <input type="file" name="files" multiple="multiple">
- <input type="submit" value="上传">
- </form>
后台: re_path('^upload/$', upload)
- def upload(request):
- if request.method == "GET":
- return render(request, 'upload.html')
- if request.method == "POST":
- # 如果一个 key 对应提交了多条数据, get 取最后一个数据, getlist 取全部数据
- last_file = request.FILES.get('files', None)
- files = request.FILES.getlist('files', None)
- # import django.core.files.uploadedfile.TemporaryUploadedFile
- # file 是 TemporaryUploadedFile 类型, 本质是对系统 file 类封装, 就是存放提交的文件数据的文件流对象
- for file in files:
- with open(file.name, 'wb') as f:
- for line in file: # 从 file 中去数据写到指定文件夹下的指定文件中
- f.write(line)
- return HttpResponse('上传成功')
- '''
来源: http://www.bubuko.com/infodetail-2971729.html