jinja2模块模板语法 django基础
jinja2去数据库中获取数据,传递给HTML页面 ,借助于模板语法 发送给浏览器 还能帮你简单方便的操作字典
去后端获取数据库中数据展示到前端页面

import pymysql def get_user(env):去数据库中获取数据,传递给HTML页面 ,借助于模板语法 发送给浏览器 还能帮你简单方便的操作字典 conn=pymysql.connect( host='127.0.0.1', post=3306, user='root', password='admin123', bd='day59',表名 charset='utf8', autocommit=Turn ) cursor=conn.cursor(cursor=pymysql.cursors.cursors.DictCursor)拿到的是字典 sql='select * frome userinfo' affect_rows=cursor.execute(sql) 返回值是这个操作所影响的函数 data_list=cursor.fetchall() #[{},{},{}] #接下来应该将获取到的数据传给HTML文件 所以要创建文件 with open(r'templates/05get_data.html','r',encoding='utf-8') tmp=Template(data) res=tmp.render(user_list=data_list) 这部分是将列表套字典都传给了HTML文件 #给get_dict.html传递了一个值 页面上通过变量名user就能拿到user_dict return res if __name__=='__main__': get_user(111)
05get_data.html

<body> <div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <h1 class="text-center">用户数据</h1> 效果居中 <table class="table table-hovar table-striped"> <thead> <tr> <th>ID</th> <th>username</th> <th>password</th> <th>hobby</th> </tr> </thead> <tbody> {% for user_dict in user_list %} for循环 也是模板语法 <tr> <td>{{user_dict.id}}</td> <td>{{user_dict.username}}</td> <td>{{user_dict.password}}</td> <td>{{user_dict.hobby}}</td> </tr> {% endfor%} </tbody> </table> </div> </div> </div> <div></div> </body> 即可再浏览器查看表格并且是实时网页 删除数据库一项数据刷新后网页同步
手写
1.socket代码需要我们自己写
2.http格式的数据自己处理(只能拿到用户辅入的路由)
·基于wsgire/模块
1.帮助你封装了socket代码
2.帮你处理http格式的数据(大字典)
wbe服务网关接口
1.请求来的时候帮助你自动拆分http格式数据并封装成非常方便处理的数据格式
2.响应走的时候帮你将数据再打包成符合http格式
根据功能的不同拆分成不同py文件(关键)
urls.py
路由与视图函数对应关系
views.py 业务逻辑的视图函数
templates模版文件夹
存储html文件
拆分完成后 后续想要添加功能 只需要在 urls.py中和views.py中书写对应的代码即可
例子二:views.py:
import datetime def get_time(env): current_time=datetime.datetime.now().strftime('%Y-%m-%d-%X') #如何将后端获取到的睡传递给HTML文件? with open(r'templates/03 mytime.html','r',encodeing='utf-8')as f: data=f.read() #data就是一堆字符串 data=data.replace('hkwfnknfk',current_time) #再后端将HTML页面处理好之后再返回给前端 return data
from jinja2 import Template def get_dict(wnv): user_dic={'username':'zhu':'age':18','hobby':study} with open(r'teplates/04 get_dict.html','r',encoding='utf-8')as f: data=f.read() tmp=Template(data) res=tmp.render(user=user_dic) #给get_dict.html传递了一个值 页面上通过变量名user就能拿到user_dict return res
路由与视图函数:
from views import * urls=[('/index',index), ('/login',login), ('/xxx',xxx), ('/get_time',get_time), ('/get_dict',get_dict) ]
04 get_dict.html:
<body> <h1>我是一个页面</h1> {{user}}取整个字典 模板语法 非常贴近Python语法 是再后端起作用的 {{user.get('username')}}字典取单个值的三种方式 {{user.age}} {{user['hobby']}} </body>
简易版本web框架流程图
wsgiret模块
1.请求来的时候解析HTTP格式的数据 封装成大字典
2.响应走的时候给数据达成成符合HTTP格式 再返回给浏览器
Python三大主流框架
1.django 特点:大而全 自带的功能特别特别特别多 类似于航空母舰 不足:有时候过于笨重
2.flask 特点:小而精 自带的功能特别少 类似于游骑兵 第三方的模块特别多 如果将flask第三方的模块加起来完全可以盖过django 并且也越来越像django 不足:比较依赖于第三方
3.tornado 特点:异步非阻塞 支持高并发 牛逼到甚至可以开发游戏服务器
A.socket部分
B.路由与视图函数对应关系(路由匹配)
C.模板语法
django:A用的是别人的 wsgiref模块 B用的是自己的 C用的是自己的(没有jinja2好用 但是也很方便)
flask A用的是别人的 Werkzeug(内部还是wsgiref模块 B自己写的 C用的别人的(jinja2)
tornado ABC全都是自己写的 异步这些全都是自己写的
注意事项
#如何让你的计算机能够正常启动django项目?
1.计算机的名称不能有中文
2.一个Python窗口只开一个项目
3.项目里面所有的文件也尽量不要出现中文
4.Python解释器尽量使用3.4-3.6之间的版本
(如果满足以上条件你的项目报错 你点击最后一个报错信息 去源码中把逗号删掉即可)
#django版本问题
1..x 2.x 3.x(直接忽略)
1.x 和2.x本身差距也不大 我们讲解主要以1.x为例 会讲解2.x区别 公司之前用的1.8 慢慢过渡到了1.11版本 有一些项目用的2.0
#django安装
pip3 install django==1.11.11 在Python中 设置里找jango 不要直接安装 需要选择1.11.11版本再安装
如果已经安装了其他版本 无需自己卸载 直接重新装会自动卸载安装新的
验证是否成功的方式一:终端输入django-damin看看有没有反应
django基本操作
一、#命令行操作
1.创建django项目
你可以先切换到对应的盘如何再创建
django-admin startproject mysite(项目名) #创建好之后应该是在c盘下 例如:django-admin startproject mydjangoproject
创建好以后搜索django出来是这样的:
mysite文件夹 manage.py mysite文件夹 __init__.py settings.py urls.py wsgi.py
2.启动django项目
创建好之后一定要先切到项目目录下:cd/mysite
通过manage.py启动再terminal中敲
命令行启动①
python3 manage.py runserver http://127.0.0.1:8000 #django端口号是8000
或者
python3 manage.py runserver 8080默认是监听本机127.0.0.1
(别人访问不到的方式),以后再项目上线时用0.0.0.0的比较多 ctrl+c是停止
pycharm启动② 右上角 点开写项目名 监听端口号 监听地址 ✓上中间第一个
django中默认情况下socket用的是wsgiref(自己写的web框架)
Ctrl+c停掉
3.创建应用app
Python3 manage.py startapp app01#APP的名字,需要见名知意
应用:django是一款专门用来开发APP的web框架,不是手机的那种APP,django框架类似于是一所大学,APP就类似于大学里面的各个学院,一个APP就是一个独立的功能模块
停掉:shift+c
4.创建的应用一定要去配置文件中注册 创建出来的应用第一步先去配置文件中注册 其他的先不要做 在settings.py 配置文件中 找到INSTALLED_APPS=.....中增加'app01.apps.App01Config'(全写)或者'app02'(简写)
ps:你在用pycharm创建项目的时候 pycharm可以帮你创建一个APP并且自动注册
主要文件介绍
--mysite 项目文件夹 --mysite 文件夹 --settings.py 配置文件 --tests.py测试相关 不用管 --wsgi.py wsgiref模块(不考虑) --manage.py django的入口文件 --db.sqlite3 django 自带的sqlite3数据库(小型数据库 功能不是很多还有bug) -day 60 项目名 --app01 文件夹app的名字 --admin.py django后台管理 --apps.py 注册使用 --migrations 文件夹 数据库迁移记录 --wsgi.py wsgi服务器的配置,以后上线了才改 --models.py 数据库相关的 模型类(orm) --urls.py 路由与视图函数对应关系(路由层) --views.py视图函数 重点 --templates 模板文件 --manage.py 启动项目创建app 各种命令的操作都跟他有关
二、#pycharm操作
pycharm操作
前提安装django
pip install django
1.new project 选择左侧第二个django即可(在安装django后之后 且关闭了其他django)
2.启动
①还是用命令行启动
②点击绿色小箭头即可
3.创建应用
①pycharm提供的终端直接输入完整命令:
Python3 manage.py startapp app01(APP的名字,需要见名知意)
②pycharm tools run manage.py task提示(输入startapp app01 前期不建议使用)
4.改端口号:点击Edi Canli...... 修改为8008 点击Appty ok
创建server edit confl......
如果没有上图显示灰色,可以
命令行创建的app要再配置文件中注册
pycharm点点点创建时候直接写上即可(只能写一个,多了还是要自己添加到配置文件中)
命令行与pycharm创建的区别
1.命令行创建不会自动有templatew文件 需要你自己手动创建而pycharm会自动帮你创建并且还会自动在配置文件中配置对应的路径
#pycharm创建
TCMPLATES=[
{
'BACKEND':'django.template.backends.django.DjangoTemplates',
'DIRS':[os.path.join(BASE_DIR,'templates')]
}
#命令行创建
TCEMPLATES=[
{
'BACKEND':'django.template.backends.django.DjangoTemplates',
'DIRS':[],
]
对比之下 命令行创建少了一部分 也就意思为你在用命令行创建django项目的时候不单单需要创建templates文件夹还需要去配置文件中配置路径:
'DIRS':[os.path.join(BASE_DIR,'templates')]
搜索配置文件与更详细的分析
django小白必会三板斧
导入:
from django.shortcuts import HttpResponse,render,redirect
HttpResponse 返回字符串类型的数据
例如:
def index(request): #param request:请求相关的所有数据对象 比你之前的env更加牛 #return: return HttpResponse("你好啊 我是django")
render 返回html文件的
return render(request,'myfirst.html') #自动去tempaltes文件夹下帮你查找文件 前 提是有添加到配置文件中
例如:
def index(request): username_dict={'username':'zhu','age':18}#视图函数必须要要接受一个形参request #第一种传值方式 return render(request,'传值的目的文件01 ab-render.html',{'data':user_dict,'data':123}) 就是将user_dict传给ab_render页面 页面上通过data就能拿到字典数据 #第二种方式:当你要传的数据特别多的时候 def index(request): username_dict={'username':'zhu','age':18} return render(request,'01 ab_render.html',locals()) Locals会将所在的名称空间中所有的名字全部传递给HTML页面
redirect 重定向
return redirect('http://www.baidu.com/') 其他url需要写全 retunrn redirect('/home/')自己的不用写ip和端口
会将所在的名称空间找那个所有的名字传递给html页面
配置文件讲解:
路由简单入门:
1.地址和视图函数的映射关系---urls.py文件
urlpatterns列表
2.现阶段使用
复制一行 改一下第一个参数(正则表达式),第二个参数是视图函数内存地址(需要导入相对应的文件信息例如:from app01 import views)
""" json格式的数据有什么用? 前后端数据交互需要使用到json作为过渡 实现跨语言传输数据 前端序列化 JSON.stringify() json.dumps() JSON.parse() json.loads() """ import json from django.http import JsonResponse def ab_json(request): user_dict = {'username':'qq好帅哦,我好喜欢!','password':'123','hobby':'girl'} l = [111,222,333,444,555] # 先转成json格式字符串 # json_str = json.dumps(user_dict,ensure_ascii=False)#不进行转码 前端显示还是中文 # 将该字符串返回 # return HttpResponse(json_str) # 读源码掌握用法 # return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})使用JsonResponse时写这个可以不进行转码 显示还是中文 # In order to allow non-dict objects to be serialized set the safe parameter to False. 报错信息 需要加safe=False # return JsonResponse(l,safe=False) # 默认只能序列化字典 序列化其他需要加safe参数
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战