Django可以更快地构建更好的Web应用程序并减少代码。
Django官方网址:https://www.djangoproject.com/
代码部分:
pip install django==2.2
pip install pillow
注:
从命令行cd到您要存储代码的目录,然后运行以下命令:
django-admin startproject myweb
注:
使用上述命令需要将django的bin目录添加到环境变量中,如:C:\Users\admin\AppData\Roaming\Python\Python36\site-packages\django\bin
要创建您的应用程序,请确保您与目录位于同一目录,manage.py 并键入以下命令:
python manage.py startapp myapp
注:若当前环境中有两个python环境,可使用python3或python3命令来调用3的环境,如:
python3 manage.py startapp myapp
在settings的INSTALLED_APPS中加载创建的新应用:
注:
运行以下命令:
要创建您的应用程序,请确保您与目录位于同一目录,manage.py 并键入以下命令:
python manage.py runserver`
注:若当前环境中有两个python环境,可使用python3或python3.6命令来调用3.6的环境,如
python3 manage.py runserver
默认情况下,该runserver命令在端口8000的内部IP上启动开发服务器。当然也可以指定端口开启服务,如8080端口:
python manage.py runserver 8080
如果要更改服务器的IP,请将其与端口一起传递。例如:
python manage.py runserver 0.0.0.0:8000
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the myapp index.")
这是Django中最简单的视图。要调用视图,我们需要将其映射到一个路由,要在myapp目录中创建一个名为urls.py。应用目录应该如下所示
from django.urls import path
from . import views
urlpatterns = [
path(r'', views.index, name='index'),
]
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path(r'\^admin/', admin.site.urls),
path(r'\^myapp/', include('myapp.urls')),
]
注:
python manage.py runserve
就像Django所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。
处理器命名即定义url的name值,就是给该url起的别名,在视图文件和前端模板中可以使用 name值进行快捷调用.
myapp中的urls.py中:
from django.urls import path
from .import views
urlpattern=[
path('',views.index_handler,name='index')
]
命名空间的作用是,当一个项目中存在多个应用时,为了防止处理器的name值冲突,所以引入了命名空间的使用.
path('user/',include(('[urls.py的地址]','[app的名字]'),namespace='[命名空间]'))
path('user/',include(('myapp.urls','myapp'),namespace='user'))
注: 加入命名空间后 ,在视图和模板层快捷调用处理器name值时,调用方式为:
namespace: name.
如下图:
如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FCkyJHpx-1575277751579)(image/2aae16fa3ddbc073c7931f5a552df25f.png)]
表达式 | 说明 |
---|---|
. | 除了\n和\r的所有字符 |
\d | 数字 |
\D | 非数字 |
\w | 数字字母和下划线 |
\W | 非数字字母和下划线 |
\s | 空格(包括制表符、换页符等) |
* | 出现次数>=0 + 出现次数>=1 |
{n} | 出现次数=n |
{n,m} | m >= 出现次数 >= n |
^ | 以开头 |
$ | 以结尾 |
from django.shortcuts import reverse
格式: reverse('[命名]') 实例: reverse("user:index")
格式: reverse('[命名]',args=(传递参数1, [传递参数2]... ...)
实例: reverse("user:re",args=("123",))
gbk' codec can't decode byte 0xa6 in position 9737: illegal multibytesequence
参考链接: https://blog.csdn.net/yixiaotian1993/article/details/89190213
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pVWiLx2x-1575277751584)(image/21a600dec791767728abc849bd2ab4c9.png)]
Django服务器收到请求后,会自动创建一个Request对象,匹配URLconf中对应的view方法,并将这个Request对象作为第一个参数传递给view方法。而view方法会经过一系列操作之后,返回一个Response对象,返回给客户端
Django中的Request对象本质是HttpRequest,django将请求报文中的请求行、首部信息、内容主体封装成HttpRequest类中的属性,当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并将 HttpRequest对象 作为第一个参数传入该函数.
关键字 | 说明 |
---|---|
method | 返回请求的方式(GET|POST) |
path | 返回页面的路径(不包括域名) |
META | 封装请求头的数据 (REMOTE_ADDR:客户端的IP地址 CONTENT_TYPE:请求正文的MIME类型) |
GET | 封装GET请求数据的QueryDict对象 |
POST | 封装POST请求数据的QueryDict对象 |
FILES | 封装上传文件数据 |
COOKIES | 封装请求的cookies,类似字典的对象 |
session | 可以读写的类似字典的对象 |
注:
HttpResponse对象由我们手动创建,我们设计的每一个视图都需要实例化,填充和返回一个HttpResponse,也就是函数的return的值。
HttpResponse( content="【响应体】", content_type="【MIME类型】", status="【状态码】" ) |
---|
MIME类型 | 解释 |
---|---|
text/html | HTML |
text/plain | 普通文本 |
application/json | Json |
状态码 | 解释 |
---|---|
200 | 请求成功 |
400 | 客户端请求语法错误 |
403 | 服务器拒绝请求 |
JsonResponse 是 HttpResponse 的子类.
代码部分:
from django.http import JsonResponse
def json_handler(request):
return JsonResponse( {
"edu":"CSDN"}, course":"Python"}, )
注:JsonResponse接收字典只接受字典格式
当字典中出现中文,需要加入json_dumps_params={“ensure_ascii”:False}
例如:
def json_handler(request):
return JsonResponse( {
"edu":"CSDN"}, course":"Python"},
json_dumps_params={
"ensure_ascii":False})
当视图函数处理完成一个逻辑后,不需要向客户端呈现数据,而是转回到其它页面(可以理解为调用其它的视图函数) 通俗理解为:视图转向视图,即一个视图跳转到另一个视图.而不是直接返回到模板html.
例如:
from django.shortcuts import redirect
def redirect_handler(request):
return redirect("/user") # 重定向到用户首页
# 通过reverse配合重定向
from django.shortcuts import reverse
def redirect_handler(request):
return redirect(reverse("user:index")) # 重定向到用户首页
注:这里使用到的 user:index 就是上边提到的命名空间和处理器命名的结合案例.
如图所示,HTML被直接硬编码在Python代码之中.尽管这种技术便于解释视图是如何工作的,但直接将HTML硬编码到你的视图里却并不符合我们的松耦合原则这样写有几处缺点:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zcxFDE0C-1575277751592)(image/1dd5827605a396936c12e727162f677f.png)]
模板是一个文本,用于分离文档的表现形式和内容.模板定义了占位符%,以及各种显示的基本逻辑,称作:模板标签.让我们从一个简单的例子模板开始
在terminal的终端输入命令python manage.py shell启动交互界面。直接创建一个Template并且直接实例化,注意在这里启动的是Django的shell交互界面,不是Python的交互界面.这里的运行机制是Python先运行manage.py,然后Django搜索DJANGO_SETTINGS_MODULE环境变量,它被设置在’books.settings’文件中,如图所示:
进行如下操作:
>>> from django.template import Template
>>> t = Template('My name is {
{ name }}.')
>>> print(t)
你将会看到下面的内容
注:0x00000000041153C8每次都会不一样,这没什么关系;这只是Python运行时Template对象的ID.
当你创建一个Template对象,模板系统在内部编译这个模板到内部格式,并做优化,做好渲染的准备
一旦你创建一个Template对象,你可以用context来传递数据给它.一个context是一系列变量和它们值的集合。
# 传递参数的构建:
context = {
"key1":"value1", "key2":["value1","value2"], "key3":{
"key3_1":"value3_1", "key3_2":"value3_2", } }
#参数的调用方式: {# 1.普通值获取 #} {
{ key1 }} {# 2.列表值获取 #} {
{ key2.0}} {
{ key2.1 }} {# 3.字典值获取 #} {
{ key3.key3_1 }} {
{ key3.key3_2 }}
# 分两种情况:
# 主路由中存在namespace命名空间
#1 不需要额外传参的视图函数:
{
% url "[namespace]:[name]" %}
#2 需要传参的视图函数:
{
% url "[namespace]:[name]" [传递的参数]%}
#主路由中没有namespace命名空间
#1 不需要额外传参的视图函数:
{
% url "[name]" %}
#2 需要传参的视图函数:
{
% url "[name]" [传递的参数]%}
模板过滤器是模板中对传递过来的数据进行修饰,再进行显示,在变量被显示前修改它的值的一个简单方法.过滤器使用的是管道字符,
单个过滤器: {
{
变量|过滤器关键字:参数 }}
多个过滤器配合: {
{
变量|过滤器1|过滤器2 }}
例如: {
{
name|lower } },表示将变量name的值变为小写输出
注:
关键字 | 说明 |
---|---|
safe | 禁止HTML转义 |
length | 长度 |
date | 日期(Y-m-d H:i:s) |
default | 默认值(变量|default:默认值) |
upper | 转大写 |
lower | 转小写 |
关键字 | 说明 |
safe | 禁止HTML转义 |
实例:
{
% block block_name % }
这里可以定义默认值 如果不定义默认值,则表示空字符串
{
% endblock % }
{
% block [代码块名称] %}
... ...
{
% endblock %}
注:调用父模板中的代码:{ { block.supper }}
{
% extends "base.html" % }
在子模板中使用block填充预留区域
{
% block block_name % }
实际填充内容
{
% endblock % }
注:
循环:
语法
{
% for ... in ... % } 循环逻辑 {
% endfor % }
实例
#1.定义参数
context = {
"hobbys":["Python","Java","C"] }
#2.进行循环
{
% for hobby in hobbys %}
爱好:{
{
hobby }}<br/>
{
% endfor %}
注: { { 用于输出变量 }} {% 命令语句 %}
判断
语法:
{
% if ... % }
逻辑1
{
% elif ... % }
逻辑2
{
% else % }
逻辑3
{
% endif % }