Web应用

# python的就业方向
1. web方向---------->就是通过浏览器访问的应用程序--------->做网站的-------->90%的工作都是web
2. 爬虫岗位--------->就是爬取数据的
3. 数据分析方向------->工作岗位不是很多
4. AI----------->没有工作经验的先不要去----------->数学--------->AutoGPT----->python写的
5. ...
# 机遇与挑战并行

# web方向
'''通过浏览器访问的应用程序!!!'''

1. 两种模式C/S、B/S
	B/S:browser---------------->server
2. Web应用程序的优点
	2.1 只需要有一个浏览器即可
    2.2 节省资源
    2.3 它们不需要更新,因为所有新的特性都在服务器上执行
3. Web应用程序的缺点
	# 特别依赖服务端程序的健壮性,言外之意就是一旦服务端宕机,客户端立马宕机.
4. Web框架
	# 框架就是别人写好的模板,我们只需要在模板中固定的位置书写代码即可
    # Django框架就是一款专门用来写web应用的框架

纯手撸web框架

1.web框架的本质
	理解1:连接前端与数据库的中间介质
	理解2:socket服务端
2.手写web框架
	1.编写socket服务端代码
 	2.浏览器访问响应无效>>>:HTTP协议
 	3.根据网址后缀的不同获取不同的页面内容
	4.想办法获取到用户输入的后缀>>>:请求数据
 	5.请求首行
    	GET /login HTTP/1.1
 		GET请求
        朝别人索要数据
  		POST请求
        朝别人提交数据
 	6.处理请求数据获取网址后缀
"""
1.socket代码过于重复
2.针对请求数据处理繁琐
3.后缀匹配逻辑过于LowB
"""
import socket


server = socket.socket()  # TCP UDP
server.bind(('127.0.0.1', 8080))  # IP PORT
server.listen(5)  # 半连接池


while True:
    sock, address = server.accept()  # 等待连接
    data = sock.recv(1024)  # 字节(bytes)
    # print(data.decode('utf8'))  # 解码打印
    sock.send(b'HTTP/1.1 200 OK\r\n\r\n')
    data_str = data.decode('utf8')  # 先转换成字符串
    target_url = data_str.split(' ')[1]  # 按照空格切割字符串并取索引1对应的数据
    # print(target_url)  # /index /login /reg
    if target_url == '/index':
        # sock.send(b'index page')
        with open(r'myhtml01.html','rb') as f:
            sock.send(f.read())
    elif target_url == '/login':
        sock.send(b'login page')
    else:
        sock.send(b'home page!')

基于wsgiref模块

内置模块 很多web框架底层使用的模块
	功能1:封装了socket代码
 	功能2:处理了请求数据
1.固定代码启动服务端
2.查看处理之后的request大字典
3.根据不同的网址后缀返回不同的内容>>>:研究大字典键值对
4.立刻解决上述纯手撸的两个问题
5.针对最后一个问题代码如何优化

from wsgiref.simple_server import make_server


def run(request, response):
    """
    :param request: 请求相关数据
    :param response: 响应相关数据
    :return: 返回给客户端的真实数据
    """
    response('200 OK', [])  # 固定格式 不用管它
    # print(request)  是一个处理之后的大字典
    path_info = request.get('PATH_INFO')
    if path_info == '/index':
        return [b'index']
    elif path_info == '/login':
        return [b'login']
    return [b'hello wsgiref module']


if __name__ == '__main__':
    server = make_server('127.0.0.1', 8080, run)  # 实时监听127.0.0.1:8080 一旦有请求过来自动给第三个参数加括号并传参数调用
    server.serve_forever()  # 启动服务端

jinja2模块

pip3 install jinja2


from jinja2 import Template


def get_dict_func(request):
    user_dict = {'name': 'jason', 'age': 18, 'person_list': ['阿珍', '阿强', '阿香', '阿红']}
    with open(r'templates/get_dict_page.html', 'r', encoding='utf8') as f:
        data = f.read()
    temp_obj = Template(data)  # 将页面数据交给模板处理
    res = temp_obj.render({'d1': user_dict})  # 给页面传了一个 变量名是d1值是字典数据的数据
    return res

<p>{{ d1 }}</p>
<p>{{ d1.name }}</p>
<p>{{ d1['age'] }}</p>
<p>{{ d1.get('person_list') }}</p>

代码封装优化

1.网址后缀的匹配问题
2.每个后缀匹配成功后执行的代码有多有少
	面条版	函数版	模块版
3.将分支的代码封装成一个个函数
4.将网址后缀与函数名做对应关系
5.获取网址后缀循环匹配
6.如果想新增功能只需要先写函数再添加一个对应关系即可
7.根据不同的功能拆分成不同的py文件
	views.py		存储核心业务逻辑(功能函数)
 	urls.py			存储网址后缀与函数名对应关系
 	templates目录	   存储html页面文件
8.为了使函数体代码中业务逻辑有更多的数据可用
	将request大字典转手传给这个函数(可用不用但是不能没有)

动静态网页

1. 静态网页
	# 只有页面,数据是写死的,比如html文件
    
2. 动态网页
	# 页面中得数据是从数据库中查询出来的
    
1.访问某个网址后缀 后端代码获取当前时间 并将该时间传到html文件上再返回给浏览器展示给用户看
	读取html内容(字符串类型) 然后利用字符串替换 最后再返回给浏览器
    
2.将字典传递给页面内容 并且在页面上还可以通过类似于后端的操作方式操作该数据
	模板语法>>>:jinja2模块

前端、后端、数据库三者联动

1.前端浏览器访问get_user 后端连接数据库查询use表中所有的数据 传递到某个html页面 弄弄好样式 再发送给浏览器展示

{% for user_dict in user_data_list %}
    <tr>
        <td>{{ user_dict.id }}</td>
        <td>{{ user_dict.name }}</td>
        <td>{{ user_dict.age }}</td>
    </tr>
{% endfor %}

python中得三大主流web框架

1. Django
	# 特点:大而全(重量级的框架),里面自带了很多的功能和模块,里面也带了很多的文件
    
2. flask
	# 特点:小而精(轻量级的框架),自身并没有多少的文件,它也一样可以做django能做的事
    它严重依赖第三方模块---------->不停的安装模块---------->所以,它比较依赖第三方
    # 当你在flask中安装的模块足够多的时候,也差不多类似于Django了

3. tornado
	# 特点:异步非阻塞,并且支持高并发
'''我们目前学习Django框架,后面在学一个flask框架,框架有很多,不必把所有的框架学一遍,因为框架之间大差不差,比如,我们学完Django之后,在去学flask,就简单很多,只需要学习与Django不同的地方'''

Django框架

1. 版本
	1.x  2.x 3.x(不学)
    # 我们以1.x为主,附带2.x的区别,1.x和2.x大部分是相同的,在drf中得学习,必须用2.x
2. 安装Django
	pip install django===1.11

# 以后我们自己装的第三方模块都在:site-packages文件夹下面
3. 如何验证django是否安装成功
	# 在cmd中,输入django-admin,看一些是否有反应,如果有反应就说明安装成功了.
4.运行django注意事项
	1.django项目中所有的文件名目录名不要出现中文
	2.计算机名称尽量也不要出现中文
 	3.一个pycharm尽量就是一个完整的项目(不要嵌套 不要叠加)
	4.不同版本的python解释器与不同版本的django可能会出现小问题

如何使用

1. 创建项目
	# 1. 命令行创建
    	'''你可以提前切换文件夹路径,用来存储django框架的文件位置'''
    	django-admin startproject 项目名
        django-admin startproject myfirst
    # 2. pycharm创建
    	
2. 启动django项目
	 # 1. cmd启动
    	先切换路径到manage.py这一层下面
        python3 manage.py runserver # 默认启动在本地电脑上
     # 2. pycharm启动
    	在上边导航栏中点击绿色按钮启动
"""Next, start your first app by running python manage.py startapp [app_label]."""
3. 创建应用
	"""
		Django框架就是一款专门用来开发web应用的
		django这个框架类类似于是一所大学(空壳)
		应用相当于是一所大学里面的二级学院
		所以,应用是可以有多个的
		eg:我们使用django开发一个淘宝出来
			用户相关的功能----------->user
			订单相关的功能------------>order
			客服相关的功能------------>kefu
			发货相关的功能------------>fahuo
			...
		每一个应用就是一个独立的功能
	"""
    # 每一个django项目至少要有一个应用!!!
 4. 如何创建应用
	# 1. cmd创建
    ********************************************************************
                python3 manage.py startapp 应用名
                python3 manage.py startapp app01
    ********************************************************************
    
    '''
    	应用名都应该做到见名知意:
    		user
    		order
    		course
    		...
   		为了方便教学,我们统一使用app01/02/03/04...
   		
    '''
    # 2. pycharm创建应用
    	新建项目的时候,一块创建应用
    # 2.1
    	Tools
        	run manage.py task
            		# 在这个里面命令前面的python3 manage.py省略不写
5. 当应用创建出来之后,第一件事先去做:
# 去配置文件setting.py中去注册应用,以后每创建出来一个应用,都要去这里面去注册,如果不注册,你创建出来的应用,不生效.
********************************************************************************
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        # 'app01.apps.App01Config', # 注册应用,全称
        'app01', 

    ]
************************************************************************************

命令行创建和pycharm创建的区别

1. 命令行创建的项目没有templates文件夹
	# 我们自己手动创建一个文件夹
2. 配置文件中:
	TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [], # 默认没有东西
    },
]


2. pycharm创建的项目会自动创建templates文件夹
配置文件中:
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')] # pycharm创建出来的有东西
    }
# 在配置文件中统一改成:
    	'DIRS': [os.path.join(BASE_DIR, 'templates')]

主要文件介绍

myfirst			# 项目名称
	app01		# 应用名称
        migrations # 它是数据库迁移记录----------->跟数据库相关的时候才会用到
        __init__.py
        admin.py  # 跟后台相关的
        apps.py   # 跟注册一些东西相关的
        models.py # 这个是跟数据库相关的文件(重要)
        tests.py  # 这个是测试文件
        views.py  # 视图函数----------->主要写一些功能逻辑
	app02
myfirst
	__init__.py
    settings.py		# django框架的配置文件
    urls.py			# 路由文件:后缀和视图函数的对应关系
    wsgi.py			# 是一个服务器------->wsgiref(支持的并发量小)----------->uwsgi服务器----->支持的并发量高
db.sqlite3		# django自带的数据库,方便我们测试使用
manage.py        # 这个是django框架的启动文件,入口文件

django小白必会三板斧

from django.shortcuts import render,HttpResponse,redirect

HttpResponse		 返回字符串类型的数据

render				返回html页面并且支持传值

redirect			重定向

def func(request):
    print('from func')
    # return HttpResponse("ok!!!") # 里面写的都是字符串
    # return render(request,'index.html') # 加载html文件
    # return redirect('http://www.baidu.com')  # 重定向
    return redirect('/home/')  # 重定向

应用views视图层里面:
image

urls路由文件里面:
image

templates里面写前端的和render连接起来