Web应用基础架构:C/S和B/S架构
一.配置Web开发环境
- 安装python https://www.python.org/downloads/
- 在环境变量中配置python环境
- 安装pycharm或者vscode
创建虚拟环境,在虚拟环境中运行django
此处运行的python版本是3.7
pip3.7 install -i https://pypi.tuna.tsinghua.edu.cn/simple package_name
1.更新pip
python3.7 -m pip install --upgrade pip
2.下载virtuaienv
pip3.7 install virtualenv
3.创建新的文件用于虚拟环境应用
4.cd 创建的新文件(virtualenv)
5.
virtualenv env1
//env1新创建的虚拟环境
6.
cd env1
cd Scripts
//激化环境
activate
deactivate //退出
7.pip list可以查看虚拟环境的列表
8.下载django(如果有两个python环境需要改一下应用程序,将原来的改为python3.10,将现在的3.7改为python3.7,同时需要复制一个python3.7应有程序,改名为python),下载django之后也可以用pip list查看一下是否有django
pip install django==2.2.3
创建Django项目
1.先创建一个新文件夹pythonweb
2.点击左下角的设置,之后点击第一个
3
注意:此时可能会出现下面的错误:
解决方法将那个虚拟文件所在的路径复制在终端返回,然后在windows中搜索power shell,以管理员身份运行它,执行下面的命令
set-ExecutionPolicy RemoteSigned
最后在vscode终端运行虚拟文件路径,将会出现
4.创建django项目:
django-admin startproject demo
cd demo
python manage.py runserver
//添加其他端口直接在后面加上就行
在项目中创建应用
创建应用
python manage.py startapp hello
激活应用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'hello',
]
编写视图
打开应用hello下的视图文件views.py,在其中编写视图函数,具体代码如下:
from django.shortcuts import render
from django import http
def index(request):
return http.HttpResponse('hello world')
配置路由
mysite/urls.py(根路由)
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('hello/',include('hello.urls')),
]
mysite/hello/urls.py(子路由)
from django.urls import path
from . import views
urlpatterns = [
path('',views.index)
]
启动开发服务器,测试应用功能
二.路由系统
1.Path()函数
path(route,view,kwargs=None,name=None)
eg: path(‘blog’,views.blog)
path(‘showblog/<article>/’,views.showblog)
- route:必选参数,匹配URL的规则,是一个字符串,其中可以包含捕获参数,以“<>”标识,如上述示例第二条URL中的<article>,article将以关键字参数的形式传递给showblog()视图。
- view:必选参数,表示视图函数,Django匹配到URL模式后会调用相应的视图,并传入一个django.http.HttpRequest对象作为第一个参数
- kwargs:接收URL地址中的任意个关键字参数,将其组织为一个字典类型的数据传递给目标视图。
- name:为URL模式取名,以便Django可以在任意地方唯一地引用它。 需要注意,使用path()函数对URL模式进行匹配时,不会对URL中的协议类型、域名、端口号进行匹配
2.内置路由转换器
根路由:
from django.contrib import admin
from django.urls import path
from app_1 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('word/<str:word>/',views.index_word),
path('num/<int:number>',views.index_num),
]
urlpatterns = [
path('str/<str:str_type>', views.str_converter), # 使用str转换器
path('int/<int:int_type>', views.int_converter), # 使用int转换器
path('slug/<slug:slug_type>', views.slug_converter), # 使用slug转换器
path('uuid/<uuid:uuid_type>', views.uuid_converter), # 使用uuid转换器
path('path/<path:path_type>', views.path_converter), # 使用path转换器
]
3.自定义路由转换器
register_converter(converter, type_name)
- converter:接收自定义的路由转换器类。
- type_name:表示在URL中使用的路由转换器名称。
创建Django项目chapter02,在此项目中创建应用app01,在应用app01中新建converter.py文件:
from django.urls import register_converter
class MyConverter:
regex = '1[3-9]\d{9}'
def to_python(self,value):
return value
def to_url(self,value):
return value
register_converter(MyConverter,'mobile')
根路由:
from django.urls import path
from app01 import converter,views # 导入应用中的converter
urlpatterns = [
path('mobile/<mobile:phone_num>/',views.show_mobile)
]
在app01应用中定义moblie视图:
from django.http import HttpResponse
def show_mobile(request, phone_num):
return HttpResponse(f'手机号为:{phone_num}')
4. 使用正则表达式匹配URL
re_path(route, view, kwargs=None, name=None)
re_path()函数的参数route接收一个正则表达式,其余参数与path()函数中参数的作用相同
命名正则表达式格式为:(?P<name>pattern),其中name表示分组名,pattern表示匹配的正则表达式。
创建一个app02应用,配置子路由:
注意还需要在setting中加入app02应用
from django.urls import re_path
from . import views
urlpatterns = [
re_path(r'^bio/(?P<bio>\w{5})/$',views.bio),
# re_path(r'^bio/(?p<bio>\w{5})/(?p<bio2>\w{5})$',views.bio),
re_path(r'^num_re/(\w{5})/(\w{5})$',views.num_re)
]
需要配置根路由:
from django.urls import path
from app01 import converter,views
from django.urls import path,include
urlpatterns = [
path('mobile/<mobile:phone_num>/',views.show_mobile),
path('', include('app02.urls')),
]
书写视图文件(在app02中):
from django.shortcuts import render
# Create your views here.
from django.shortcuts import HttpResponse
# Create your views here.
def bio(request,bio):
return HttpResponse(f'{bio+bio}')
def num_re(request,num_re,num_re1):
return HttpResponse(num_re+num_re1)
5.路由分发
使用include()函数实现路由分发有以下2种方式:
include(module,namespace = None) # 1.引入应用
URLconf include(pattern_list) # 2.引入URL模式列表
- module:用于指定URLconf模块。
- namespace:用于指定URL模式实例的命名空间。
- pattern_list:用于指定一个可迭代的path或re_path实例列表。
# 根URLconf
urlpatterns = [
path('blog/', include('app02.urls'),
path('',include('app01.urls'))
]
# app02应用URLconf
urlpatterns = [
path('archive/', views.archive),
path('about/', views.about),
]
#表示url请求127.0.0.1:8000/blog/archive
6.使用reverse()反向解析URL
reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)
- viewname:URL模式名称或可调用的视图对象。必选
- urlconf:一个包含URL模式的URLconf模块。
- args:传递给URL的列表类型的参数。
- kwargs:传递给URL的字典类型的参数。
- current_app:当前视图所属的应用。
注意,reverse()函数中参数args与kwargs不能同时使用。Django中的语法,其他地方不可以使用
在根路由中加入:
from django.urls import path,include
path('app03/',include('app03.urls'))
新建应用app03中加入urls
from django.urls import path
from app03 import views
urlpatterns = [
# 反向解析url模式
path('url-reverse/',views.get_url,name='url'),
# 反向解析函数
path('login/',views.login,name='login'),
# 在模板中反向解析URL
path('hello/',views.hello,name='hello'),
]
app03中的视图文件:
注意hello函数中需要在setting中加入:
同时在INSTALLED_APPS中加入app03:
同时注意需要在chapte2项目中新建templates
helloworld.html中的代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>hello world</h1>
{% url 'login' %}
<div>
<a href="{% url 'login' %}">点击我</a>
</div>
</body>
</html>
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
from django.shortcuts import render
# Create your views here.
from django.shortcuts import reverse
from django.shortcuts import HttpResponse
def get_url(request):
return HttpResponse(f"反向解析的url为:{reverse('url')}")
def login(request):
return HttpResponse(f"反向解析的url为:{reverse('login')}")
def hello(request):
return render(request,'helloworld.html')
7.实现页面跳转的方法
href="{% url '名字' %}"
创建项目HelloWorld
创建应用app1
注意需要在setting文件中加入app1,以及templates的路径
根路径:
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('app1/',include('app1.urls')),
]
子路径:
from django.urls import path
from app1 import views
urlpatterns = [
path('python/',views.python_web,name='python'),
path('about/',views.about,name='about'),
]
views文件:
from django.shortcuts import render
# Create your views here.
from django.shortcuts import HttpResponse
def python_web(request):
return render(request,'python.html')
def about(request):
return render(request,'about.html')
python.html:
注意:那个about表示子路径中你需要跳转的文件的名字
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>python-web</title>
</head>
<body>
<a href="{% url 'about' %}">关于python web开发</a>
</body>
</html>
about.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。
使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能的 Web 服务 Django 本身基于 MVC 模型,即 Model(模型)+ View(视图)+ Controller(控制器)设计模式,MVC 模式使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。<br/>
<h2>
<a href="{% url 'python' %}">返回首页</a>
</h2>
</body>
</html>
三.模型与数据库
1.连接数据库环境
//虚拟环境
//创建项目
django-admin startproject chapter03
cd chapter03
python manage.py startapp books
//settings.py修改
installed apps:{
'books'
}
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'HOST':'127.0.0.1',
'PORT': 3306,
'USER':'root',
'PASSWORD':'123456'
}
安装
mysql -uroot -p
create database test;
show databases;
//安装驱动程序
pip install mysqlclient
pip install .\mysqlclient-1.4.6-cp37-cp37m-win_amd64.whl
(2059报错)加密方式更改:https://www.cnblogs.com/Beginner-Y/p/13798942.html
python manage.py runserver
models.py 文件里面进行设置
class BookInfo(models.Model):
name = models.CharField(max_length=20, verbose_name="名称")
pub_date = models.DateField(verbose_name="发布日期")
readcount = models.IntegerField(default=0, verbose_name="阅读量")
commentcount = models.IntegerField(default=0, verbose_name="评论量")
is_delete = models.BooleanField(default=False, verbose_name="逻辑删除")
def __str__(self):
return self.name
//生成迁移文件
python manage.py makemigrations
//执行迁移文件
python manage.py migrate
最后查看mysql的视图软件,出现下面的表示配置成功。
2.增加数据
在应用的models中加
from django.db import models
class BaseModel(models.Model):
name = models.CharField(max_length=20, verbose_name="名称")
pub_date = models.DateField(verbose_name="发布日期")
class Meta:
abstract = True
def __str__(self):
return self.name
class BookInfo(BaseModel):
readcount = models.IntegerField(default=0, verbose_name="阅读量")
commentcount = models.IntegerField(default=0, verbose_name="评论量")
is_delete = models.BooleanField(default=False, verbose_name="逻辑删除")
def __str__(self):
return self.name
class ImageInfo(BaseModel):
likecount = models.IntegerField(default=False, verbose_name="点赞量")
def __str__(self):
return self.name
//生成迁移文件
python manage.py makemigrations
//执行迁移文件
python manage.py migrate
python manage.py shell
#导入models的相关文件
from books.models import BookInfo
#增加数据
BookInfo.objects.create(name='三国演义',pub_date='1937-2',readcount=100,commentcount=70,is_delete=0)
#增加数据
a=BookInfo.objects.create(name='西游记',pub_date='2023-6-7',readcount=70,is_delete=0)
#可以查看数据
a.name
#save的方法增加数据
bookinfo=BookInfo(name='python',pub_date='1996-8-6',readcount=70,commentcount=67,is_delete=0)
bookinfo.save()
3.查询数据
- all()方法:查询模型在数据库映射的表中的所有记录,返回值是一个QuerySet对象,该对象是一个类似列表的结构,它支持for循环、索引(不支持负索引)、切片等操作。
- filter()方法:根据查询条件查询数据表,返回满足条件的数据,返回值是一个QuerySet对象
- exclude()方法:根据查询条件查询数据库,返回不满足条件的数据,返回值是一个QuerySet对象
- get()方法:根据查询条件进行查找,返回符合条件的一条记录,返回值是一个模型对象。
models.py数据:
from django.db import models
# 自定义管理器
class CountryManager(models.Manager):
def country_name_prefix(self):
# 查询所有结果
all_countries = self.all()
for country in all_countries:
country.country_name = '国家' + country.country_name
return all_countries
class Country(models.Model):
country_code = models.CharField(max_length=20)
country_name = models.CharField(max_length=50)
objects = CountryManager()
class Meta:
db_table = 'country'
class PersonManager(models.Manager):
def get_queryset(self):
return super(PersonManager,self).get_queryset().filter(person_nation__exact=1)
# 一对多
class Person(models.Model):
person_name = models.CharField(max_length=20)
person_age = models.IntegerField(default=0)
person_money = models.IntegerField(default=0)
person_nation = models.ForeignKey(Country,on_delete=models.CASCADE,db_column='f')
objects = PersonManager()
class Meta:
db_table = 'person'
class President(models.Model):
president_name = models.CharField(max_length=70)
president_gender = models.CharField(max_length=10)
president_nation_id = models.OneToOneField(Country,on_delete=models.CASCADE,db_column='f')
class Meta:
db_table = "president"
def __str__(self):
return self.country_name
from django.db import models
class BaseModel(models.Model):
name = models.CharField(max_length=20, verbose_name="名称")
pub_date = models.DateField(verbose_name="发布日期")
class Meta:
abstract = True
def __str__(self):
return self.name
class BookInfo(BaseModel):
readcount = models.IntegerField(default=0, verbose_name="阅读量")
commentcount = models.IntegerField(default=0, verbose_name="评论量")
is_delete = models.BooleanField(default=False, verbose_name="逻辑删除")
def __str__(self):
return self.name
class ImageInfo(BaseModel):
likecount = models.IntegerField(default=False, verbose_name="点赞量")
def __str__(self):
return self.name
all()方法
from books.models import BookInfo
all_info=BookInfo.objects.all()
all_info
#<QuerySet [<BookInfo: 三国演义>, <BookInfo: 西游记>, <BookInfo: python>]>
all_info[0].name
#'三国演义'
info_list=[info for info in all_info]
info_list
#[<BookInfo: 三国演义>, <BookInfo: 西游记>, <BookInfo: python>]
info_list=[info.name for info in all_info]
info_list
#['三国演义', '西游记', 'python']
filter()方法
from books.models import BookInfo
book_info=BookInfo.objects.filter(id=3)
boo_info
#<QuerySet [<BookInfo: python>]>
exclude()方法
ex_info=BookInfo.objects.exclude(id=3)
ex_info
#<QuerySet [<BookInfo: 三国演义>, <BookInfo: 西游记>]>
ex_info[0].name
#'三国演义'
get()方法
book_obj=BookInfo.objects.get(id=3)
book_obj
#<BookInfo: python>
book_obj.name
#'python'
values接受可选参数
all_info=BookInfo.objects.all().values()
all_info
#<QuerySet [{'id': 1, 'name': '三国演义', 'pub_date': datetime.date(1937, 1, 2), 'readcount': 100, 'commentcount': 70, 'is_delete': False}, {'id': 2, 'name': '西游记', 'pub_date': datetime.date(2023, 6, 7), 'readcount': 70, 'commentcount': 0, 'is_delete': False}, {'id': 3, 'name': 'python', 'pub_date': datetime.date(1996, 8, 6), 'readcount': 70, 'commentcount': 67, 'is_delete': False}]>
all_info=BookInfo.objects.values('name')
all_info
#<QuerySet [{'name': '三国演义'}, {'name': '西游记'}, {'name': 'python'}]>
all_info=BookInfo.objects.all().values_list('name')
all_info
#<QuerySet [('三国演义',), ('西游记',), ('python',)]>
order_by()方法
name=BookInfo.objects.order_by('id')
for i in name:
... print(i.name)
#或者
name
<QuerySet [<BookInfo: 三国演义>, <BookInfo: 西游记>, <BookInfo: python>]>
4.删除数据
delete()方法
book_obj=BookInfo.objects.get(id=1)
book_obj
#<BookInfo: 三国演义>
book_obj.delete()
#(1, {'books.BookInfo': 1})
5.更新数据
res=BookInfo.objects.filter(id=2).update(is_delete=1)
res
#1
6.多表查询
常见的运算符:
1对多正向查询
语法:当前模型对象.关联字段.关联模型中要查询的字段
from books.models import Person
p=Person.objects.get(id=1)
p.person_name
#'小红'
country_name=p.person_nation.country_name
country_name
#'china'
反向查询
语法:当前模型对象.关联模型表名(小写)_set.all()
from books.models import Country
c=Country.objects.get(id=1)
c
#<Country: Country object (1)>
p_country=c.person_set.all()
p_country
一对一
正向查询
语法:当前模型对象.关联字段.关联模型中要查询的字段
from books.models import President
from books.models import Country
p=President.objects.get(id=1)
p.president_name
#'aa'
country_name=p.president_nation_id.country_name
country_name
#'china'
反向查询
语法:当前模型对象.关联模型表名(小写).关联模型中要查询的字段
c=Country.objects.get(id=1)
c.country_name
#'china'
c.president.president_name
#'aa'
F对象,Q对象
from books.models import BookInfo
from django.db.models import F,Q
BookInfo.objects.filter(readcount__gt=F('commentcount'))
#<QuerySet [<BookInfo: 三国演义>, <BookInfo: python>]>
BookInfo.objects.filter(Q(readcount__gt=10) & Q(id__lt=3))
#<QuerySet [<BookInfo: 西游记>, <BookInfo: 三国演义>]>
BookInfo.objects.filter(Q(readcount__gt=10) | Q(id__gt=2))
#<QuerySet [<BookInfo: 西游记>, <BookInfo: 三国演义>, <BookInfo: python>]>
BookInfo.objects.filter(~Q(readcount__lt=80))
#<QuerySet [<BookInfo: python>]>
7.聚合函数
from django.db.models import Avg,Min
BookInfo.objects.aggregate(Avg('readcount'),Min('commentcount'))
#{'readcount__avg': 78.3333, 'commentcount__min': 65}
BookInfo.objects.aggregate(avg=Avg('readcount'),min=Min('commentcount'))
#{'avg': 78.3333, 'min': 65}
四.模板
1.使用模板文件
注意:templates需要建议在应用中,与app同层级
视图文件:
from django.shortcuts import render
from datetime import datetime
from django.http.response import HttpResponse
# Create your views here.
# get_template
from django.template.loader import get_template
# 准备数据
time2 = datetime.today()
def demo1(request):
# 载入模板文件
t = get_template('time.html')
# 渲染模板
html = t.render({'time':time2})
return HttpResponse(html)
# render_to_string
from django.template.loader import render_to_string
def demo2(request):
str_response = render_to_string('time.html',{'time':time2})
return HttpResponse(str_response)
# TemplateResponse
from django.template.response import TemplateResponse
def demo3(request):
return TemplateResponse(request,'time.html',{'time':time2})
# render
def demo4(request):
return render(request,'time.html',{'time':time2})
def demo5(request):
add1 = [1,2,3]
add2 = [4,5,6]
time = datetime.now()
value = [{'name':'张三','age':17},{'name':'李四','age':34},{'name':'王五','age':35}]
c = {'a':5,'b':add1,'second':add2,'c':"I don't know",'d':'laura','f':'he ll o w','g':time,'h':'','i':value,'j':'<a&sd>',}
return render(request,'demo5.html',c)
子路由:
from app1 import views
from django.urls import path
urlpatterns = [
path('demo1/',views.demo1),
path('demo2/',views.demo2),
path('demo3/',views.demo3),
path('demo4/',views.demo4),
path('demo5/',views.demo5),
]
根路由:
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('app1/',include('app1.urls')),
]
time.html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>{
{time}}</h1>
</body>
</html>
2.变量
{ { variable }}
模板变量名由字母、数字和下画线(“_”)组成,但不能以下画线开头。
过滤器用于过滤变量,获取更精确的数据
{ { variables|filters }}
过滤器:
视图文件:
def demo6(request):
a = {'k':123456789,'l':[1,2,4],'m':12,'n':'asdfg','o':'ASFG','p':[2,4,6,8],'q':'hello world'}
return render(request,'demo6.html',a)
子路由:
path('demo6/',views.demo6),
demo6.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<p>
filesizeformat:{
{k|filesizeformat}}<br/>
join:{
{l|join:"//"}}<br/>
linenumbers:{
{m|linenumbers}}<br/>
length:{
{n|length}}<br/>
lower/upper:{
{o|lower}}<br/>
random:{
{p|random}}<br/>
truncatewords:{
{q|truncatewords:2}}
</p>
</body>
</html>
demo5.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<p>
add1:{
{a|add:'32'}}<br/>
add2:{
{b|add:second}}<br/>
addslashes:{
{c|addslashes}}<br/>
capfirst:{
{d|capfirst}}<br/>
cut:{
{f|cut:""}}<br/>
date:{
{g|date:"Y年m月d日"}}<br/>
default:{
{h|default:"35"}}<br/>
dictsort:{
{i|dictsort:"age"}}<br/>
escape:{
{j|escape}}<br/>
</p>
</body>
</html>
3.标签
{% tag %} ... {% endtag %}
for
demo7.html文件:
{% for m in data %}
<li>{
{m}}</li>
{% endfor %}
demo8.html文件:
<p>
{% for r in data %}
第{
{forloop.counter}}行:
{% for a in r %}
<li>{
{a}}</li>
{% endfor %}
{% endfor %}
</p>
demo9.html文件:
<p>
{% for k,v in data.items %}
<li>{
{k}}={
{v}}</li>
{% endfor %}
</p>
demo_f.html文件:
{% for r in data %}
<li>{
{r}}</li>
{% empty %}
<li>抱歉,图书列表为空</li>
{% endfor %}
视图文件:
from django.shortcuts import render
from datetime import datetime
from django.http.response import HttpResponse
#遍历
def demo7(request):
data = ['西游记','水浒传','三国演义']
return render(request,'demo7.html',{'data':data})
#双层遍历
def demo8(request):
data = [[1,2,3],['s','f','g'],[8,9,0]]
return render(request,'demo8.html',{'data':data})
#遍历字典
def demo9(request):
data = {'name':'张三','age':18}
return render(request,'demo9.html',{'data':data})
#empty就像elif
def demo_for(request):
data = [1,'',4]
return render(request,'demo_f.html',{'data':data})
子路由:
from app1 import views
from django.urls import path
path('demo7/',views.demo7),
path('demo8/',views.demo8),
path('demo9/',views.demo9),
path('demo_f/',views.demo_for),
if/elif/else
demo11.html文件:
<p>
分数:{
{data}}
班级:{
{clsl}}
{% if data >= 90 %}
等级A
{% elif data >= 80 %}
等级B
{% elif data >= 60 %}
等级C
{% else %}
{% endif %}
</p>
视图文件:
def demo11(request):
data = 79
clsl = 277
return render(request,'demo11.html',{'data':data,'clsl':clsl})
子路由:
path('demo11/',views.demo11),
4.继承
在app1应用中
子路由:
from app1 import views
from django.urls import path
urlpatterns = [
path('base/',views.show_base),
path('detail/',views.show_detail),
]
视图文件:
from django.shortcuts import render
from datetime import datetime
from django.http.response import HttpResponse
def show_detail(request):
return render(request,'detail.html')
def show_base(request):
return render(request,'base.html')
base.html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}页面标题{% endblock %} </title>
</head>
<body>
{% block header %}
<h1>标题</h1>
{% endblock header %}
{% block main %}
<h2>页面内容</h2>
{% endblock %}
<br/>
{% block footer %}
<div class="footer no-mp">
<div>
<a href="#">关于我们</a>
<span></span>
<a href="#">联系我们</a>
<span></span>
<a href="#">招聘人才</a>
<span></span>
<a href="#">友情链接</a>
<span></span>
</div>
<p>版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_74421072/article/details/134264782
</p>
</div>
{% endblock %}
</body>
</html>
detail.html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
{% extends 'base.html' %}
{% block title %}
列表页面
{% endblock %}
{% block header %}
<h1>书单</h1>
{% endblock header %}
{% block main %}
<a href="#">《鲁迅全集》</a>
<a href="#">《秋雨散文集》</a>
<a href="#">《黑暗森林》</a>
<a href="#">《月亮与六便士》</a>
{% endblock main %}
</body>
</html>
五.视图
返回日期:
视图文件:(在chapter5项目中的chapter5/views.py文件中)
from django.http import HttpResponse
from datetime import date
def showData(request,urlData):
d = date.today()
s = 'url路径中的数据:%s<br/>当前日期:%s' %(urlData,d)
return HttpResponse(s)
url.py根路由:
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('test<urlData>',views.showData),
]
验证:
get请求
视图文件:
from django.http import HttpResponse
from datetime import date
def showGetData(request):
s = '请求上传数据:名字=%s,年龄=%s' %(request.GET['name'],request.GET['age'])
return HttpResponse(s)
根路由:
path('get',views.showGetData),
验证:
下载txt文件
视图文件:
def downloadFile(request):
r = HttpResponse('文件内容',content_type = 'text/text ;charset=utf-8')
r['Content-Disposition'] = 'attachment;filename="test.txt"'
r.write('\n<h1>test</h1>')
return r
根路由:
path('txt/',views.downloadFile),
验证:
csv文件
视图文件:
import csv
def writecsv(request):
r = HttpResponse(content_type = 'text/text ;charset=utf-8')
r['Content-Disposition'] = 'attachment;filename="data.csv"'
w = csv.writer(r)
w.writerow(['one',1,3,5])
w.writerow(['two',3,66,8])
return r
根路由:
path('csv/',views.writecsv),
验证:
pdf文件
视图文件:
# pip install reportlab
def writepdf(request):
from reportlab.lib.units import cm
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfgen import canvas
from reportlab.lib.colors import red
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'attachment;filename="data.pdf"'
pdfmetrics.registerFont(TTFont('songti','simsun.ttc'))
c = canvas.Canvas(response,pagesize=(10*cm,5*cm))
c.setFont('songti',18)
c.setFillColor(red)
c.drawString(0.5*cm,4*cm,'python web简明教程')
c.showPage()
c.save()
return response
根路由:
path('pdf/',views.writepdf),
验证:
json格式
视图文件:
from django.http import JsonResponse
def writejson(request):
return JsonResponse({'name':'张三','data':[123,'abc']})
根路由:
path('json/',views.writejson),
验证:
数据分页
连接数据库,注意setting中数据
新建应用app
models.py文件:之后执行文件迁移
from django.db import models
# Create your models here.
class user(models.Model):
name = models.CharField(max_length=20)
age = models.IntegerField()
视图文件:
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
from . import models
def useModels(request):
uname = request.GET['name']
uage = request.GET['age']
models.user.objects.create(name=uname,age=uage)
s = '默认数据库中的user表数据:<br><table><tr><td>id</td><td>name</td>age</td></tr>'
for u in models.user.objects.all():
s+='<tr><td>%s</td><td>%s<td><td>%s</td></tr>'%(u.id,u.name,u.age)
return HttpResponse(s+'</table>')
子路由:
from django.urls import path
from app import views
urlpatterns = [
path('shuju/',views.useModels),
]
根路由:
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('app/',include('app.urls')),
]
验证:
数据分页模板
视图文件:
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
from django.views import View
class testclassView(View):
def get(self,request):
return render(request,'classview.html',{'method':'GET'})
def post(self,request):
out = request.POST['DATA']
return render(request,'classview.html',{'out':out,'method':'POST'})
模板文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>使用基于类的视图</title>
</head>
<body>
<h1>使用基于类的视图</h1>
<hr/>
<form action="" name="input" method="post">
{%csrf_token%}
请求方法:{
{method}}<br/>
请输入数据:<input type="text" name="DATA"><br/>
<input type="submit" value="提交">
</form>
上传的数据为{
{out}}
</body>
</html>
子路由:
from django.urls import path
from app2 import views
from django.views.decorators.csrf import csrf_exempt
urlpatterns = [
path('testview',views.testclassView.as_view())
]
根路由同理