社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
私信  •  关注

rzlvmp

rzlvmp 最近回复了
3 年前
回复了 rzlvmp 创建的主题 » 在不使用Nginx的情况下使用SSL部署Django
  1. 内置开发服务器的使用( manage.py runserver )是一个 bad idea 用于生产环境。但是,是的 you can use SSL connection
  2. 更好的办法是使用一些应用服务器。例如 gunicorn .是的,你也可以 SSL connection 和gunicorn在一起。
  3. Apache或Nginx服务器不是 just for https 。这些允许您有效地控制其他服务器资源,如最大进程数、请求/响应头等。WEB服务器支持许多无需编写python代码即可设置的功能。这对infra/服务器工程师来说更容易理解。
3 年前
回复了 rzlvmp 创建的主题 » 最具python风格的方式是使用function获取用户输入

这三个例子都可以根据具体情况使用。这里没有错误的例子(除了 num1 num2 不需要作为的函数参数传递 Example3 )

我个人的看法是:

  1. 例3 这很糟糕,因为将来可能很难测试。假设你想测试一下 2 + 2 == 4 :

    def add(n1, n2):
      return n1 + n2
    
    assert 2 + 2 == add(2, 2)
    

    万一 例3 测试是不可能的 add 没有用户输入

  2. 你的函数调用了 添加 所以 添加 必须只关心添加。如果你调用你的函数 get_input_sum 然后 例3 这是最正确的

  3. 添加 名称有点宽,所以很难猜测它应该返回sum还是concat字符串?如果你叫它 sum 然后函数必须关心你在其中传递的内容:

    def sum(n1, n2):
      try:
        n1, n2 = int(n1), int(n2)
      except ValueError:
        print('Only numeric values accepted')
        raise
      return n1 + n2
    

    在这种情况下,你会确信 总和 永远都是正确的 '2' + '2' 4 但不是 '22'

    如果你投 str -> int 检查外面的类型 总和 函数您必须关心在函数编号或字符串中传递的内容。

    然而,如果 添加 更宽,你不希望看到真正的 总和 (假设你想做以下事情: [1] + [2] => [1, 2] )然后你应该检查函数之外的类型。

总之:正确答案取决于上下文

3 年前
回复了 rzlvmp 创建的主题 » 从停止的docker容器中删除文件(不创建新图像)

用别人的提示自己回答 answer

  1. 查找docker主机上存储的目录:

    export LOCAL_DIR=$(docker inspect -f '{{ .GraphDriver.Data.UpperDir }}' container_name)
    
  2. 在本地删除文件:

    sudo rm -f ${LOCAL_DIR}/run/service.pid
    
  3. 运行容器:

    docker start container_name
    

或是一应俱全:

sudo rm -f "$(docker inspect -f '{{ .GraphDriver.Data.UpperDir }}' container_name)/run/service.pid" && docker start container_name
3 年前
回复了 rzlvmp 创建的主题 » 向外部流量打开主机网络上运行的docker端口

Listening at: http://127.0.0.1:8000

意味着gunicorn在听 localhost docker集装箱公司。无法从外部网络访问容器的本地主机。你应该设定 0.0.0.0:8000 能够从外面进入。

是的,你试着设置

host = "0.0.0.0"
port = "8000"

但是古尼康 config file 没有 host port 参数。你应该使用 bind = '0.0.0.0:8000' 相反

别忘了 publish port -p 8000:8000 运行容器时

3 年前
回复了 rzlvmp 创建的主题 » 如何在Django中将数据保存到不同的模型

我想尝试在另一个表中保存数据。有最喜欢的桌子和食物桌,我需要做的是把最喜欢的模型上的食物转移到食物桌上

如何在两个相同的表之间复制数据的简单示例:

范例

from django.db import models

class Food(models.Model):
    name = models.CharField(max_length=30)
    price = models.CharField(max_length=30)

    class Meta:
        db_table = "food"

class Favorite(Food):
    class Meta:
        db_table = "favorite"

复制过程(使用 ID = 1 (进入收藏夹)

from djangoapp.models import Food, Favorite

food = Food.objects.get(id=1)
favorite = Favorite()
for attr in food._meta.fields:
  if attr.verbose_name == 'ID':
    continue
  setattr(favorite, attr.verbose_name, getattr(food, attr.verbose_name))
favorite.save()

但是在没有特殊原因的情况下,在数据库中复制数据是非常糟糕的方式。

例如,您的食物可能会在菜单中停止,但客户仍然可以在最喜欢的数据中看到它。所以你需要删除食物和最喜欢的桌子的数据

更好的方法是创建关系表,而不是复制数据:

from django.db import models

class Food(models.Model):
    name = models.CharField(max_length=30)
    price = models.CharField(max_length=30)

    class Meta:
        db_table = "food"

class Client(models.Model):

    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

    class Meta:
        db_table = "client"

class Favorite(models.Model):

    client_id = models.ForeignKey(Client)
    food_id = models.ForeignKey(Food)

    class Meta:
        db_table = "favorite"

之后,您可以在收藏夹中添加新记录:

favorite = Favorite()
favorite.client_id = 1
favorite.food_id = 2
favorite.save()

这意味着 Client 具有 ID=1 补充 Food 具有 ID = 2 拥有 Favorites

在这种情况下,如果删除 食物 具有 ID=2 最爱的关系 [1,2] 也将被删除(取决于设置)。

  • 根据其他车型信息编辑1更新答案

好的,在你的情况下,将食物数据复制到收藏夹中会是这样的

def add_to_today_foods(request, pk):
  food = get_object_or_404(Food, pk=pk)
  favorite = Favorite()
  
  if request.method == 'POST':
    for attr in food._meta.fields:
      if attr.verbose_name in ['ID', 'eaten_date']:
        continue
      setattr(favorite, attr.verbose_name, getattr(food, attr.verbose_name))
    favorite.user = request.user
    favorite.save()
    return redirect('today_foods')
  context = {
    'food': food,
    'favorite': favorite,
  }
  return render(request, 'base/add_to_today_foods.html', context)

*しかし、データをコピーする方法、非常におすすめではりません。

3 年前
回复了 rzlvmp 创建的主题 » Django rest framework视图集中的chainig权限

@凯尔已经描述了这个问题,他的答案应该被接受

但我会尝试添加一些细节:

  1. 当我们链接两个权限类时,DRF会创建一个新的权限类 OR 课程:
>>> from rest_framework.permissions import IsAdminUser 
>>> or_class = [IsAdminUser | IsAdminUser]
>>> len(or_class)
1
>>> print(or_class)
[<rest_framework.permissions.OperandHolder object at 0x1096d5fa0>]
>>> 
  1. 德扬戈 documentation 他说 has_object_permission (检查确切对象的权限)方法在之后运行 has_permission (检查整个视图类的权限)

  2. 让我们看看这些方法在内部是如何链接的 课程:

>>> import inspect
>>> or_instance = or_class[0]()
>>> print(inspect.getsource(or_instance.has_permission))
    def has_permission(self, request, view):
        return (
            self.op1.has_permission(request, view) or
            self.op2.has_permission(request, view)
        )

>>> print(inspect.getsource(or_instance.has_object_permission))
    def has_object_permission(self, request, view, obj):
        return (
            self.op1.has_object_permission(request, view, obj) or
            self.op2.has_object_permission(request, view, obj)
        )

所以我们可以看到DRF检查了这两个 你有许可吗 然后我们两个 拥有_object _权限

你有许可吗 检查可能会被跳过,因为我们正在运行 拥有_object _权限 之后

但是 拥有_object _权限 没有在内部实现 IsAdminUser 权限类,但它是在父类中实现的 BasePermission 类,看起来像:

class BasePermission(metaclass=BasePermissionMetaclass):
    def has_object_permission(self, request, view, obj):
        return True

所以 艾德明 总是回来 True 在…上 拥有_object _权限 .通常情况下 艾德明 应该失败 你有许可吗 ,但在你的 你有许可吗 已通过,因为它未在内部实现 AccountOwnerPermission

最简单的解决方案是添加 你有许可吗 方法 帐户所有者权限 课程:

class AccountOwnerPermission(permissions.BasePermission):
    def has_permission(self, request, view, obj):
        return False